library(dplyr)

Attaching package: <U+393C><U+3E31>dplyr<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:stats<U+393C><U+3E32>:

    filter, lag

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    intersect, setdiff, setequal, union
library(ggplot2)
library(lubridate)   

Attaching package: <U+393C><U+3E31>lubridate<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    date
library(hydroGOF)
package <U+393C><U+3E31>hydroGOF<U+393C><U+3E32> was built under R version 3.4.1Loading required package: zoo
package <U+393C><U+3E31>zoo<U+393C><U+3E32> was built under R version 3.4.1
Attaching package: <U+393C><U+3E31>zoo<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    as.Date, as.Date.numeric
library(xtable)
library(knitr)
library(tidyr)
library(RSQLite)
package <U+393C><U+3E31>RSQLite<U+393C><U+3E32> was built under R version 3.4.1
library(agricolae)
library(scales)
package <U+393C><U+3E31>scales<U+393C><U+3E32> was built under R version 3.4.1
library(zoo)
library(polynom)
package <U+393C><U+3E31>polynom<U+393C><U+3E32> was built under R version 3.4.1

lode observed data

upDir <- "D:/R/CombinedData/"
obsData <- "D:/R/CombinedData/"
obsAll <- read.table(paste0(obsData, "ObsAll1.txt"),
                   header = TRUE)
obsA4<- obsAll %>%
  dplyr::filter(Collection=="2014_2018")%>%
  mutate(StartDate=dmy(StartDate),MidDate=dmy(MidDate),FinishDate=dmy(FinishDate),Clock.Today=dmy(Clock.Today)) %>%
  #mutate(SowingDate=as.factor(ifelse(SowingDate=="no","Sd_No",paste0("Sd_",SowingDate)))) %>% # assume this is typo to be fixed?
  mutate(GrowthSeason1=as.factor(paste0("Gs_",GrowthSeason))) %>% # creating more intuitive labels here
  mutate(Rotation1=as.factor(paste0("Rt_",Rotation))) %>%
  mutate(ExpUnitCode=as.factor(paste0(Name,GrowthSeason1,Rotation1))) %>%
  mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))%>%
  mutate(GrowthSeason2=as.factor(paste0("Y",GrowthSeason,"(",Period,")"))) %>%
  mutate(Rotation2=as.factor(ifelse(Rotation=="1",paste0("S",Rotation),paste0("R",Rotation))))
 
obsA3<- obsAll %>%
  dplyr::filter(Collection=="2002_2004")%>%
  mutate(StartDate=dmy(StartDate),MidDate=dmy(MidDate),FinishDate=dmy(FinishDate),Clock.Today=dmy(Clock.Today)) %>%
  #mutate(SowingDate=as.factor(ifelse(SowingDate=="no","Sd_No",paste0("Sd_",SowingDate)))) %>% # assume this is typo to be fixed?
  mutate(GrowthSeason1=as.factor(paste0("Gs_",GrowthSeason))) %>% # creating more intuitive labels here
  mutate(Rotation1=as.factor(paste0("Rt_",Rotation))) %>%
  mutate(ExpUnitCode=as.factor(paste0(Name,GrowthSeason1,Rotation1))) %>%
  mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))%>%
  mutate(GrowthSeason2=as.factor(paste0("Y",GrowthSeason,"(",Period,")"))) %>%
  mutate(Rotation2=as.factor(paste0("R",Rotation)))
  
obsAR<-rbind(obsA3,obsA4)
summary(obsAR)
  Clock.Today                                     Name         Collection         Experiment   Water      Defoliation
 Min.   :2002-06-15   Iversen_91DefoliationLL       :895   1997_2001:   0   Lincoln2015:1361   dry:   0   HH: 288    
 1st Qu.:2003-11-09   Iversen_121DefoliationLLFDFD5 :828   2000_2002:   0   Lincoln2003: 384   irr:2258   LL:1970    
 Median :2015-04-24   Iversen_121DefoliationHHFDFD5 :288   2002_2004: 895   Lincoln2002: 257                         
 Mean   :2011-04-08   Iversen_121DefoliationLLFDFD10:124   2010_2012:   0   Lincoln2004: 254                         
 3rd Qu.:2016-05-15   Iversen_121DefoliationLLFDFD2 :123   2014_2018:1363   Lincoln2016:   2                         
 Max.   :2018-08-23   Iversen_12SowingDateSD1       :  0                    Lincoln1997:   0                         
                      (Other)                       :  0                    (Other)    :   0                         
   SowingDate      FD           Period     GrowthSeason      Rotation       StartDate             MidDate          
 no     :1363   FD10: 124   15_16  :479   Min.   :1.000   Min.   :1.000   Min.   :2002-06-14   Min.   :2002-08-09  
 No     : 895   FD2 : 123   02_03  :432   1st Qu.:1.000   1st Qu.:2.000   1st Qu.:2003-10-06   1st Qu.:2003-10-24  
 SD1    :   0   FD5 :2011   03_04  :412   Median :2.000   Median :3.000   Median :2015-03-12   Median :2015-04-03  
 SD10   :   0               16_17  :393   Mean   :1.984   Mean   :3.195   Mean   :2011-03-07   Mean   :2011-04-04  
 SD2    :   0               14_15  :340   3rd Qu.:3.000   3rd Qu.:5.000   3rd Qu.:2016-04-08   3rd Qu.:2016-04-28  
 SD3    :   0               17_18  :149   Max.   :5.000   Max.   :7.000   Max.   :2018-07-12   Max.   :2018-08-02  
 (Other):   0               (Other): 53                                                                            
   FinishDate            Interval              Variable     VariableUnits       Time         Observed           StdDEV       
 Min.   :2002-10-05   Min.   :  0.00   Height      :311   kg/ha    :777   12:00:00:2258   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:2003-11-12   1st Qu.: 15.00   NodeNumber  :308   Fraction :434                   1st Qu.:   2.10   1st Qu.:   0.00  
 Median :2015-04-26   Median : 29.00   LAI         :251   fractio0l:349                   Median :  12.82   Median :   0.51  
 Mean   :2011-05-03   Mean   : 32.88   shootbiomass:235   m2/m2    :251                   Mean   : 777.13   Mean   : 125.46  
 3rd Qu.:2016-05-18   3rd Qu.: 41.00   Branch      :217   cm       :204                   3rd Qu.: 736.00   3rd Qu.:  80.01  
 Max.   :2018-08-24   Max.   :114.00   RootWt      :192   %        :136                   Max.   :8944.38   Max.   :2709.07  
                                       (Other)     :744   (Other)  :107                                     NA's   :858      
 ExperimentID  TreatmentID         ID      GrowthSeason1 Rotation1                           ExpUnitCode  
 E1:   0      ILL    :895   E3ILL   :895   Gs_1:773      Rt_1:542   Iversen_91DefoliationLLGs_2Rt_1:  84  
 E2:   0      ILLF5  :828   E5ILLF5 :828   Gs_2:904      Rt_2:433   Iversen_91DefoliationLLGs_1Rt_1:  72  
 E3: 895      IHHF5  :288   E5IHHF5 :288   Gs_3:430      Rt_3:399   Iversen_91DefoliationLLGs_1Rt_4:  67  
 E4:   0      ILLF10 :124   E5ILLF10:124   Gs_4:145      Rt_4:285   Iversen_91DefoliationLLGs_1Rt_5:  67  
 E5:1363      ILLF2  :123   E5ILLF2 :123   Gs_5:  6      Rt_5:254   Iversen_91DefoliationLLGs_1Rt_3:  66  
              DLL    :  0   E1DLL   :  0                 Rt_6:216   Iversen_91DefoliationLLGs_1Rt_6:  62  
              (Other):  0   (Other) :  0                 Rt_7:129   (Other)                        :1840  
  Clock.Today1                   GrowthSeason2   Rotation2  
 Min.   :2002-06-15 12:00:00   Y2(15_16):478   R2     :433  
 1st Qu.:2003-11-09 18:00:00   Y1(02_03):432   R3     :399  
 Median :2015-04-24 12:00:00   Y2(03_04):412   S1     :335  
 Mean   :2011-04-09 09:38:03   Y3(16_17):379   R4     :285  
 3rd Qu.:2016-05-15 12:00:00   Y1(14_15):340   R5     :254  
 Max.   :2018-08-23 12:00:00   Y4(17_18):143   R6     :216  
                               (Other)  : 74   (Other):336  
 obsAR
upDir <- "D:/R/CombinedData/"
obsData <- "D:/R/CombinedData/"
obsSRF <- read.table(paste0(obsData, "Defoliation.txt"),
                   header = TRUE)
obsDS<- obsSRF %>%
  #dplyr::filter(FD=="FD5")%>%
  mutate(StartDate=dmy(StartDate),MidDate=dmy(MidDate),FinishDate=dmy(FinishDate),Clock.Today=dmy(Clock.Today))%>%
  mutate(GrowthSeason1=as.factor(paste0("Gs_",GrowthSeason))) %>% # creating more intuitive labels here
  mutate(Rotation1=as.factor(paste0("Rt_",Rotation))) %>%
  mutate(ExpUnitCode=as.factor(paste0(Name,GrowthSeason1,Rotation1))) %>%
  mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))%>%
  mutate(GrowthSeason2=as.factor(paste0("Y",GrowthSeason,"(",Period,")"))) %>%
 mutate(Rotation2=as.factor(paste0("R",Rotation)))%>%
   dplyr::filter(Variable==c("shootbiomass"))
 obsDS
 obsDR<- obsSRF %>%
  #dplyr::filter(FD=="FD5")%>%
  mutate(StartDate=dmy(StartDate),MidDate=dmy(MidDate),FinishDate=dmy(FinishDate),Clock.Today=dmy(Clock.Today))%>%
  mutate(GrowthSeason1=as.factor(paste0("Gs_",GrowthSeason))) %>% # creating more intuitive labels here
  mutate(Rotation1=as.factor(paste0("Rt_",Rotation))) %>%
  mutate(ExpUnitCode=as.factor(paste0(Name,GrowthSeason1,Rotation1))) %>%
  mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))%>%
  mutate(GrowthSeason2=as.factor(paste0("Y",GrowthSeason,"(",Period,")"))) %>%
 mutate(Rotation2=as.factor(paste0("R",Rotation)))%>%
   dplyr::filter(Variable==c("RootWt"))
 obsDSR<-rbind(obsDS,obsDR)
 
 write.csv( obsDSR,"D:/R/CombinedData/obsDSR.csv", row.names = FALSE) 

obs Vs Pre for each experiment

upDir <- "D:/R/"
obsData <- "D:/R/TtAll/"
Tt<- read.table(paste0(obsData, "df.all.txt"),
               header = TRUE)
TtA <- Tt %>% mutate(Clock.Today=dmy(Clock.Today), ExpUnitCode=as.factor(ExpName))
TtA
ObsDRSR1 <-merge(obsDSR,TtA,by=c("Clock.Today","ExpUnitCode")) %>%
  mutate(GrowthRotation=as.factor(paste0(GrowthSeason.x,Rotation.x)))%>%
  dplyr::filter(Water.x=="irr")%>%
  dplyr::filter(Variable=="RootWt")
  
ObsDRSS1 <-merge(obsDSR,TtA,by=c("Clock.Today","ExpUnitCode")) %>%
  mutate(GrowthRotation=as.factor(paste0(GrowthSeason.x,Rotation.x)))%>%
  dplyr::filter(Water.x=="irr")%>%
  dplyr::filter(Variable=="shootbiomass")
ObsDRS1<-rbind(ObsDRSR1,ObsDRSS1)
summary(ObsDRS1)
  Clock.Today                                  ExpUnitCode                               Name         Collection  
 Min.   :2002-07-30   Iversen_91DefoliationLSGs_1Rt_1:  75   Iversen_91DefoliationLS       :680   2002_2004:1905  
 1st Qu.:2003-09-02   Iversen_91DefoliationLSGs_2Rt_1:  70   Iversen_91DefoliationSL       :660   2014_2018:1780  
 Median :2004-09-02   Iversen_91DefoliationLSGs_1Rt_3:  60   Iversen_91DefoliationSS       :565                   
 Mean   :2009-11-23   Iversen_91DefoliationSLGs_2Rt_1:  55   Iversen_121DefoliationSSFDFD5 :545                   
 3rd Qu.:2016-05-16   Iversen_91DefoliationLSGs_1Rt_4:  50   Iversen_121DefoliationSSFDFD2 :310                   
 Max.   :2018-08-09   Iversen_91DefoliationLSGs_2Rt_2:  50   Iversen_121DefoliationSSFDFD10:300                   
                      (Other)                        :3325   (Other)                       :625                   
      Experiment.x  Water.x    Defoliation.x SowingDate.x   FD.x      GrowthSeason.x   Rotation.x       StartDate         
 Lincoln2002: 380   irr:3685   HH: 625       no:1780      FD10: 480   Min.   :1.00   Min.   : 1.000   Min.   :2002-06-14  
 Lincoln2003: 930              LS: 680       No:1905      FD2 : 490   1st Qu.:1.00   1st Qu.: 2.000   1st Qu.:2003-06-13  
 Lincoln2004: 595              SL: 660                    FD5 :2715   Median :2.00   Median : 4.000   Median :2004-06-12  
 Lincoln2015:1780              SS:1720                                Mean   :2.06   Mean   : 4.259   Mean   :2009-10-20  
 Lincoln2016:   0                                                     3rd Qu.:3.00   3rd Qu.: 6.000   3rd Qu.:2016-05-16  
                                                                      Max.   :5.00   Max.   :10.000   Max.   :2018-07-11  
                                                                                                                          
    MidDate             FinishDate            Interval              Variable       VariableUnits    Period          Time     
 Min.   :2002-08-01   Min.   :2002-09-19   Min.   :  0.00   shootbiomass:2070   kg/ha     :3685   02_03:820   12:00:00:3685  
 1st Qu.:2003-08-09   1st Qu.:2003-10-05   1st Qu.: 16.00   RootWt      :1615   %         :   0   03_04:950                  
 Median :2004-08-07   Median :2004-10-03   Median : 26.00   Branch      :   0   cm        :   0   04_05:135                  
 Mean   :2009-11-11   Mean   :2009-12-10   Mean   : 34.11   Fraction    :   0   Fraction  :   0   14_15:360                  
 3rd Qu.:2016-06-13   3rd Qu.:2016-07-11   3rd Qu.: 40.00   Height      :   0   fractional:   0   15_16:565                  
 Max.   :2018-07-25   Max.   :2018-08-09   Max.   :116.00   LAI         :   0   franction :   0   16_17:460                  
                                                            (Other)     :   0   (Other)   :   0   17_18:395                  
    Observed           StdDEV        ExperimentID   Treatment          ID      GrowthSeason1   Rotation1  
 Min.   :    0.0   Min.   :   0.00   E3:1905      ILS    :680   E3ILS   :680   Gs_1:1180     Rt_1   :685  
 1st Qu.:  539.4   1st Qu.:   0.00   E5:1780      ISL    :660   E3ISL   :660   Gs_2:1515     Rt_2   :565  
 Median : 2937.5   Median :   7.78                ISS    :565   E3ISS   :565   Gs_3: 595     Rt_3   :510  
 Mean   : 4442.9   Mean   : 204.06                ISSF5  :545   E5ISSF5 :545   Gs_4: 380     Rt_4   :415  
 3rd Qu.: 4846.6   3rd Qu.: 245.69                ISSF2  :310   E5ISSF2 :310   Gs_5:  15     Rt_6   :330  
 Max.   :53100.0   Max.   :2826.66                ISSF10 :300   E5ISSF10:300                 Rt_5   :305  
                                                  (Other):625   (Other) :625                 (Other):875  
  Clock.Today1                   GrowthSeason2   Rotation2        year           day             rain             maxt     
 Min.   :2002-07-30 12:00:00   Y2(03_04):950   R1     :685   Min.   :2002   Min.   :  3.0   Min.   : 0.000   Min.   : 6.5  
 1st Qu.:2003-09-02 12:00:00   Y1(02_03):820   R2     :565   1st Qu.:2003   1st Qu.: 84.0   1st Qu.: 0.000   1st Qu.:14.3  
 Median :2004-09-02 12:00:00   Y2(15_16):565   R3     :510   Median :2004   Median :191.0   Median : 0.000   Median :17.5  
 Mean   :2009-11-23 16:49:44   Y3(16_17):460   R4     :415   Mean   :2009   Mean   :182.4   Mean   : 1.106   Mean   :17.9  
 3rd Qu.:2016-05-16 12:00:00   Y4(17_18):380   R6     :330   3rd Qu.:2016   3rd Qu.:280.0   3rd Qu.: 0.200   3rd Qu.:20.6  
 Max.   :2018-08-09 12:00:00   Y1(14_15):360   R5     :305   Max.   :2018   Max.   :365.0   Max.   :42.200   Max.   :33.0  
                               (Other)  :150   (Other):875                                                                 
      mint             mean            radn            wind             vp              Pp             Tbb       TTbroken      
 Min.   :-4.900   Min.   : 2.40   Min.   : 1.90   Min.   :0.500   Min.   : 6.10   Min.   :10.03   Min.   :1   Min.   : 0.2577  
 1st Qu.: 3.700   1st Qu.: 9.40   1st Qu.: 7.80   1st Qu.:2.800   1st Qu.: 9.50   1st Qu.:11.62   1st Qu.:2   1st Qu.: 5.4545  
 Median : 7.700   Median :12.60   Median :13.90   Median :3.900   Median :10.30   Median :13.50   Median :3   Median : 8.0772  
 Mean   : 7.321   Mean   :12.53   Mean   :15.04   Mean   :3.889   Mean   :11.15   Mean   :13.48   Mean   :3   Mean   : 8.3783  
 3rd Qu.:10.800   3rd Qu.:15.80   3rd Qu.:21.80   3rd Qu.:4.700   3rd Qu.:13.20   3rd Qu.:15.52   3rd Qu.:4   3rd Qu.:10.9836  
 Max.   :17.400   Max.   :24.70   Max.   :34.40   Max.   :8.900   Max.   :18.90   Max.   :16.65   Max.   :5   Max.   :18.7077  
                                                                                                                               
     TTfick            TTbeta                                     ExpName          Experiment.y  Water.y    Defoliation.y
 Min.   : 0.2577   Min.   : 0.004684   Iversen_91DefoliationLSGs_1Rt_1:  75   Lincoln1997:   0   dry:   0   HH: 625      
 1st Qu.: 5.9837   1st Qu.: 1.498341   Iversen_91DefoliationLSGs_2Rt_1:  70   Lincoln2000:   0   irr:3685   LL:   0      
 Median : 8.9376   Median : 3.287059   Iversen_91DefoliationLSGs_1Rt_3:  60   Lincoln2001:   0              LS: 680      
 Mean   : 9.0536   Mean   : 4.603942   Iversen_91DefoliationSLGs_2Rt_1:  55   Lincoln2002:1905              SL: 660      
 3rd Qu.:11.7728   3rd Qu.: 6.426553   Iversen_91DefoliationLSGs_1Rt_4:  50   Lincoln2003:   0              SS:1720      
 Max.   :19.4833   Max.   :20.777376   Iversen_91DefoliationLSGs_2Rt_2:  50   Lincoln2010:   0                           
                                       (Other)                        :3325   Lincoln2015:1780                           
  SowingDate.y    FD.y      GrowthSeason.y   Rotation.y   Tt_beta_sum        Tt_fick_sum       Tt_broken_sum     
 No     :1905   FD10: 480   Gs_1:1180      Rt_1   :685   Min.   :  0.2021   Min.   :   1.819   Min.   :   1.819  
 no     :1780   FD2 : 490   Gs_2:1515      Rt_2   :565   1st Qu.: 48.2265   1st Qu.: 140.654   1st Qu.: 129.434  
 SD1    :   0   FD5 :2715   Gs_3: 595      Rt_3   :510   Median : 92.9239   Median : 238.217   Median : 222.164  
 SD10   :   0   FD6 :   0   Gs_4: 380      Rt_4   :415   Mean   :133.0108   Mean   : 274.890   Mean   : 253.850  
 SD2    :   0               Gs_5:  15      Rt_6   :330   3rd Qu.:161.3106   3rd Qu.: 343.286   3rd Qu.: 312.236  
 SD3    :   0               Gs_6:   0      Rt_5   :305   Max.   :688.7477   Max.   :1152.983   Max.   :1020.480  
 (Other):   0                              (Other):875                                                           
      Ppm            Tmean        GrowthRotation
 Min.   :10.18   Min.   : 6.714   21     : 270  
 1st Qu.:11.35   1st Qu.: 9.189   31     : 215  
 Median :13.52   Median :12.630   22     : 210  
 Mean   :13.43   Mean   :12.353   12     : 205  
 3rd Qu.:15.12   3rd Qu.:15.181   13     : 200  
 Max.   :16.61   Max.   :19.460   23     : 190  
                                  (Other):2395  

Combine observed data with Tt

upDir <- "D:/R/"
obsData <- "D:/R/TtAll/"
Tt<- read.table(paste0(obsData, "df.all.txt"),
               header = TRUE)
TtA <- Tt %>% mutate(Clock.Today=dmy(Clock.Today), ExpUnitCode=as.factor(ExpName))
TtA
ObsRSR1 <-merge(obsAR,TtA,by=c("Clock.Today","ExpUnitCode")) %>%
  mutate(GrowthRotation=as.factor(paste0(GrowthSeason.x,Rotation.x)))%>%
  dplyr::filter(Tbb==1)%>%
  dplyr::filter(Water.x=="irr")%>%
  dplyr::filter(Defoliation.x=="LL")%>%
  dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
   mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))
ObsRSS1 <-merge(obsAR,TtA,by=c("Clock.Today","ExpUnitCode")) %>%
  mutate(GrowthRotation=as.factor(paste0(GrowthSeason.x,Rotation.x)))%>%
  dplyr::filter(Tbb==1)%>%
  dplyr::filter(Water.x=="irr")%>%
  dplyr::filter(Defoliation.x=="LL")%>%
  dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
   mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))
ObsRS1<-rbind(ObsRSR1,ObsRSS1)  
summary(ObsRS1)
  Clock.Today                                  ExpUnitCode                              Name         Collection 
 Min.   :2002-07-30   Iversen_91DefoliationLLGs_1Rt_1: 30   Iversen_91DefoliationLL       :296   1997_2001:  0  
 1st Qu.:2003-12-03   Iversen_91DefoliationLLGs_2Rt_1: 26   Iversen_121DefoliationLLFDFD5 :180   2000_2002:  0  
 Median :2015-04-20   Iversen_91DefoliationLLGs_1Rt_3: 24   Iversen_121DefoliationLLFDFD10:158   2002_2004:296  
 Mean   :2011-09-03   Iversen_91DefoliationLLGs_1Rt_4: 20   Iversen_121DefoliationLLFDFD2 :158   2010_2012:  0  
 3rd Qu.:2016-11-22   Iversen_91DefoliationLLGs_1Rt_5: 20   Iversen_121DefoliationHHFDFD5 :  0   2014_2018:496  
 Max.   :2018-08-23   Iversen_91DefoliationLLGs_1Rt_6: 20   Iversen_12SowingDateSD1       :  0                  
                      (Other)                        :652   (Other)                       :  0                  
      Experiment.x Water.x   Defoliation.x  SowingDate.x   FD.x         Period    GrowthSeason.x    Rotation.x   
 Lincoln2015:496   dry:  0   HH:  0        no     :496   FD10:158   02_03  :144   Min.   :1.000   Min.   :1.000  
 Lincoln2003:142   irr:792   LL:792        No     :296   FD2 :158   16_17  :140   1st Qu.:1.000   1st Qu.:2.000  
 Lincoln2004: 86                           SD1    :  0   FD5 :476   03_04  :136   Median :2.000   Median :3.000  
 Lincoln2002: 68                           SD10   :  0              15_16  :136   Mean   :2.101   Mean   :3.359  
 Lincoln1997:  0                           SD2    :  0              14_15  :128   3rd Qu.:3.000   3rd Qu.:5.000  
 Lincoln1998:  0                           SD3    :  0              17_18  : 92   Max.   :5.000   Max.   :7.000  
 (Other)    :  0                           (Other):  0              (Other): 16                                  
   StartDate             MidDate             FinishDate            Interval              Variable     VariableUnits
 Min.   :2002-06-14   Min.   :2002-08-09   Min.   :2002-10-05   Min.   :  0.00   shootbiomass:440   kg/ha    :792  
 1st Qu.:2003-11-13   1st Qu.:2003-12-05   1st Qu.:2003-12-28   1st Qu.: 14.00   RootWt      :352   %        :  0  
 Median :2015-03-12   Median :2015-04-03   Median :2015-04-26   Median : 34.00   Branch      :  0   2        :  0  
 Mean   :2011-08-02   Mean   :2011-08-28   Mean   :2011-09-24   Mean   : 32.61   CrownWt     :  0   cm       :  0  
 3rd Qu.:2016-10-08   3rd Qu.:2016-10-31   3rd Qu.:2016-11-24   3rd Qu.: 42.00   Fraction    :  0   fractio0l:  0  
 Max.   :2018-07-12   Max.   :2018-08-02   Max.   :2018-08-24   Max.   :113.00   HardStemWt  :  0   Fraction :  0  
                                                                                 (Other)     :  0   (Other)  :  0  
       Time        Observed          StdDEV        ExperimentID  TreatmentID         ID      GrowthSeason1 Rotation1 
 12:00:00:792   Min.   :   0.0   Min.   :   0.00   E1:  0       ILL    :296   E3ILL   :296   Gs_1:272      Rt_1:196  
                1st Qu.: 848.9   1st Qu.:   0.00   E2:  0       ILLF5  :180   E5ILLF5 :180   Gs_2:272      Rt_2:110  
                Median :3095.2   Median :  34.28   E3:296       ILLF10 :158   E5ILLF10:158   Gs_3:156      Rt_3:132  
                Mean   :3050.9   Mean   : 294.79   E4:  0       ILLF2  :158   E5ILLF2 :158   Gs_4: 80      Rt_4:114  
                3rd Qu.:4922.6   3rd Qu.: 407.91   E5:496       DLL    :  0   E1DLL   :  0   Gs_5: 12      Rt_5: 96  
                Max.   :8556.4   Max.   :2709.07                DLLS1  :  0   E1ILL   :  0                 Rt_6: 96  
                                                                (Other):  0   (Other) :  0                 Rt_7: 48  
  Clock.Today1                   GrowthSeason2   Rotation2        year           day           rain             maxt      
 Min.   :2002-07-30 12:00:00   Y1(02_03):144   R3     :132   Min.   :2002   Min.   :  3   Min.   : 0.000   Min.   : 8.70  
 1st Qu.:2003-12-03 18:00:00   Y3(16_17):140   S1     :124   1st Qu.:2003   1st Qu.: 72   1st Qu.: 0.000   1st Qu.:14.50  
 Median :2015-04-20 12:00:00   Y2(03_04):136   R4     :114   Median :2015   Median :141   Median : 0.000   Median :18.10  
 Mean   :2011-09-04 07:49:32   Y2(15_16):136   R2     :110   Mean   :2011   Mean   :173   Mean   : 1.218   Mean   :18.49  
 3rd Qu.:2016-11-22 12:00:00   Y1(14_15):128   R5     : 96   3rd Qu.:2016   3rd Qu.:282   3rd Qu.: 0.300   3rd Qu.:21.82  
 Max.   :2018-08-23 12:00:00   Y4(17_18): 80   R6     : 96   Max.   :2018   Max.   :357   Max.   :42.200   Max.   :30.90  
                               (Other)  : 28   (Other):120                                                                
      mint             mean            radn            wind             vp              Pp             Tbb       TTbroken     
 Min.   :-4.900   Min.   : 2.70   Min.   : 1.90   Min.   :0.700   Min.   : 6.30   Min.   :10.08   Min.   :1   Min.   : 2.342  
 1st Qu.: 4.250   1st Qu.:10.28   1st Qu.: 8.18   1st Qu.:3.000   1st Qu.: 9.90   1st Qu.:11.67   1st Qu.:1   1st Qu.: 6.661  
 Median : 7.900   Median :12.80   Median :13.40   Median :3.800   Median :10.26   Median :13.72   Median :1   Median : 8.585  
 Mean   : 7.936   Mean   :13.12   Mean   :15.51   Mean   :3.845   Mean   :11.43   Mean   :13.68   Mean   :1   Mean   : 9.258  
 3rd Qu.:11.225   3rd Qu.:16.60   3rd Qu.:22.38   3rd Qu.:4.700   3rd Qu.:13.20   3rd Qu.:15.98   3rd Qu.:1   3rd Qu.:11.766  
 Max.   :16.500   Max.   :22.10   Max.   :31.50   Max.   :8.600   Max.   :18.70   Max.   :16.65   Max.   :1   Max.   :17.215  
                                                                                                                              
     TTfick           TTbeta                                   ExpName         Experiment.y Water.y   Defoliation.y
 Min.   : 2.827   Min.   : 0.2367   Iversen_91DefoliationLLGs_1Rt_1: 30   Lincoln1997:  0   dry:  0   HH:  0       
 1st Qu.: 8.013   1st Qu.: 2.0415   Iversen_91DefoliationLLGs_2Rt_1: 26   Lincoln2000:  0   irr:792   LL:792       
 Median :10.169   Median : 3.9520   Iversen_91DefoliationLLGs_1Rt_3: 24   Lincoln2001:  0             LS:  0       
 Mean   :10.620   Mean   : 5.3509   Iversen_91DefoliationLLGs_1Rt_4: 20   Lincoln2002:296             SL:  0       
 3rd Qu.:13.471   3rd Qu.: 7.3907   Iversen_91DefoliationLLGs_1Rt_5: 20   Lincoln2003:  0             SS:  0       
 Max.   :18.289   Max.   :16.6247   Iversen_91DefoliationLLGs_1Rt_6: 20   Lincoln2010:  0                          
                                    (Other)                        :652   Lincoln2015:496                          
  SowingDate.y   FD.y     GrowthSeason.y   Rotation.y   Tt_beta_sum        Tt_fick_sum      Tt_broken_sum          Ppm       
 no     :496   FD10:158   Gs_1:272       Rt_1   :196   Min.   :  0.2834   Min.   :  4.022   Min.   :  3.333   Min.   :10.25  
 No     :296   FD2 :158   Gs_2:272       Rt_3   :132   1st Qu.: 55.9318   1st Qu.:149.733   1st Qu.:127.992   1st Qu.:11.35  
 SD1    :  0   FD5 :476   Gs_3:156       Rt_4   :114   Median :105.7388   Median :323.449   Median :274.306   Median :13.34  
 SD10   :  0   FD6 :  0   Gs_4: 80       Rt_2   :110   Mean   :149.1638   Mean   :317.614   Mean   :275.524   Mean   :13.60  
 SD2    :  0              Gs_5: 12       Rt_5   : 96   3rd Qu.:216.9278   3rd Qu.:465.695   3rd Qu.:400.156   3rd Qu.:15.65  
 SD3    :  0              Gs_6:  0       Rt_6   : 96   Max.   :503.1694   Max.   :894.316   Max.   :787.327   Max.   :16.55  
 (Other):  0                             (Other): 48                                                                         
     Tmean        GrowthRotation
 Min.   : 7.024   11     : 78   
 1st Qu.:10.242   13     : 60   
 Median :13.398   21     : 50   
 Mean   :12.851   14     : 44   
 3rd Qu.:15.365   22     : 44   
 Max.   :18.729   25     : 44   
                  (Other):472   
mytheme1<-theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14,angle=90, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))
mytheme3<-theme(
     legend.title = element_text(colour="black", size=14, face="bold"),
     legend.text = element_text(colour="black", size = 14,face="plain"),
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14),
    legend.position = "right", legend.box = "vertical")

Plot data

ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E3ILL<-ObsRS1%>%
  filter(ID=="E3ILL")
# simD1<-simD%>%
#    mutate(Clock.Today = ymd_hms(Clock.Today))%>%
#    dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
#    dplyr::filter(Clock.Today>"2002-06-01")%>%
#    dplyr::filter(Name=="Iversen_91DefoliationLL")
#   simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))  
# Root.L<-Root.dfA%>%
#   dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#   
  
E3ILL%>%
  dplyr::filter(GrowthSeason.x=="1")%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E3ILL","(Iversen_91DefoliationLL)"))+
  #geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILL.png", width=8, height=6, dpi=500)
ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E3ILL<-ObsRS1%>%
  filter(ID=="E3ILL")
# simD1<-simD%>%
#    mutate(Clock.Today = ymd_hms(Clock.Today))%>%
#    dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
#    dplyr::filter(Clock.Today>"2002-06-01")%>%
#    dplyr::filter(Name=="Iversen_91DefoliationLL")
#   simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))  
# Root.L<-Root.dfA%>%
#   dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#   
  
E3ILL%>%
  dplyr::filter(GrowthSeason.x=="2")%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E3ILL","(Iversen_91DefoliationLL)"))+
  #geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILL.png", width=8, height=6, dpi=500)
E3ILL%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  #geom_line(y=5500,size=2)+
  facet_grid(Variable~ID)+ggtitle(paste0("E3ILL","(Iversen_91DefoliationLL)"))+
  #geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILL.png", width=8, height=6, dpi=500)

E5LS

obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E3ILS<-obsDSR%>%
  filter(ID=="E3ILS")
E3ILS%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  #geom_line(y=5500,size=2)+
  facet_grid(Variable~ID)+ggtitle(paste0("E3ILS","(Iversen_91DefoliationLS)"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILS.png", width=8, height=6, dpi=500)

E5SL

obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E3ISL<-obsDSR%>%
  filter(ID=="E3ISL")
E3ISL%>%
  ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E3ISL","(Iversen_91DefoliationSL)"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E3ISL.png", width=8, height=6, dpi=500)

E3ISS

obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E3ISS<-obsDSR%>%
  filter(ID=="E3ISS")
E3ISS%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
 # geom_line(y=5500,size=2)+
  facet_grid(Variable~ID)+ggtitle(paste0("E3ISS","(Iversen_91DefoliationSS)"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E3ISS.png", width=8, height=6, dpi=500)

E5ILLF5

ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E5ILLF5<-ObsRS1%>%
  filter(ID=="E5ILLF5")
# simD1<-simD%>%
#    mutate(Clock.Today = ymd_hms(Clock.Today))%>%
#    dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
#    dplyr::filter(Clock.Today>"2002-06-01")%>%
#    dplyr::filter(Name=="Iversen_91DefoliationLL")
#   simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))  
# Root.L<-Root.dfA%>%
#   dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#   
  
E5ILLF5%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5","(Iversen_121DefoliationLLFD5)"))+
  #geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E5ILLF5.png", width=8, height=6, dpi=500)

E5ISSF5

obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E5ISSF5<-obsDSR%>%
  filter(ID=="E5ISSF5")
E5ISSF5%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E5ISSF5","(Iversen_121DefoliationSSFD5)"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E5ISSF5.png", width=8, height=6, dpi=500)

load Root and shoot data for HH

obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E5IHHFD5<-obsDSR%>%
  filter(ID=="E5IHHF5")%>%
  mutate(GrowthRotation=paste0(GrowthSeason,Rotation))
E5IHHFD5%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E5IHHF5","(Iversen_121DefoliationHHFD5)"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E5IHHF5.png", width=8, height=6, dpi=500)
obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E5IHHFD2<-obsDSR%>%
  filter(ID=="E5IHHF2")%>%
  mutate(GrowthRotation=paste0(GrowthSeason,Rotation))
E5IHHFD2%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E5IHHF5"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E5IHHF2.png", width=8, height=6, dpi=500)

E5ILLF2

ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E5ILLF2<-ObsRS1%>%
  filter(ID=="E5ILLF2")
# simD1<-simD%>%
#    mutate(Clock.Today = ymd_hms(Clock.Today))%>%
#    dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
#    dplyr::filter(Clock.Today>"2002-06-01")%>%
#    dplyr::filter(Name=="Iversen_91DefoliationLL")
#   simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))  
# Root.L<-Root.dfA%>%
#   dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#   
  
E5ILLF2%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+
  #geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))
ggsave("D:/R/Pictures/C5/Yield//E5ILLF2.png", width=8, height=6, dpi=500)

E5ILLF10

ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E5ILLF10<-ObsRS1%>%
  filter(ID=="E5ILLF10")
# simD1<-simD%>%
#    mutate(Clock.Today = ymd_hms(Clock.Today))%>%
#    dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
#    dplyr::filter(Clock.Today>"2002-06-01")%>%
#    dplyr::filter(Name=="Iversen_91DefoliationLL")
#   simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))  
# Root.L<-Root.dfA%>%
#   dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#   
  
E5ILLF10%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+
  #geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))
ggsave("D:/R/Pictures/C5/Yield//E5ILLF10.png", width=8, height=6, dpi=500)

proof

obsDSRR<-obsDSR%>%
  filter(Variable=="RootWt")%>%
  mutate(RootWt=Observed)
obsDSRS<-obsDSR%>%
   filter(Variable=="shootbiomass")%>%
  dplyr::select(Name,Clock.Today,Observed)%>%
  mutate(shootbiomass=Observed)%>%
  mutate(Clock.Today=ymd(Clock.Today))%>%
  mutate(Name=factor(Name))
 
All<-merge(obsDSRR,obsDSRS,by=c("Clock.Today","Name"))%>%
  mutate(Biomass=RootWt+shootbiomass)%>%
  mutate(Proot=1-shootbiomass/Biomass)%>%
  mutate(GrowthRotation=paste0(GrowthSeason,Rotation))
All%>%
  filter(ExperimentID=="E3")%>%
  unique()%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_text()+
  theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E3Proot.png", width=8, height=6, dpi=500)
All%>%
  filter(ExperimentID=="E5")%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_text()+
  theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E5Proot.png", width=8, height=6, dpi=500)

Proot LL

ObsRS1R<-ObsRS1%>%
  filter(Variable=="RootWt")%>%
  mutate(RootWt=Observed)
ObsRS1S<-ObsRS1%>%
   filter(Variable=="shootbiomass")%>%
  dplyr::select(Name,Clock.Today,Observed)%>%
  mutate(shootbiomass=Observed)%>%
  mutate(Clock.Today=ymd(Clock.Today))%>%
  mutate(Name=factor(Name))
 
LLAll<-merge(ObsRS1R,ObsRS1S,by=c("Clock.Today","Name"))%>%
  filter(Tbb==1)%>%
  mutate(Biomass=RootWt+shootbiomass)%>%
  mutate(Proot=1-shootbiomass/Biomass)%>%
  unique()
LLAll%>%
  filter(ExperimentID=="E3")%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_text()+
  theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E3LLProot.png", width=8, height=6, dpi=500)
LLAll%>%
  filter(ExperimentID=="E5")%>%
  filter(shootbiomass!="0")%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_line(size=2)+
  theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E5LLProot.png", width=8, height=6, dpi=500)

Cum oberved

ungroup.rowwise_df <- function(x) {
  class(x) <- c( "tbl_df", "data.frame")
  x
}
E5IHHFD5S<-E5IHHFD5%>%
dplyr::filter(Variable=="shootbiomass")
uniGY <- unique(E5IHHFD5S$ExpUnitCode)
df.all <- data.frame()
 
for(i in 1:length(uniGY)){
  
 cum<-E5IHHFD5S%>%
   rowwise() %>%
   mutate(GrowthRotation=paste0(GrowthRotation,Rotation))%>%
  ungroup.rowwise_df()%>%
  mutate(Shoot=cumsum(Observed))
 
 df.all <- rbind(df.all,cum)
 }
  
summary(df.all)
                             Name         Collection        Experiment  Water     Defoliation SowingDate    FD     
 Iversen_121DefoliationHHFDFD5 :615   2002_2004:  0   Lincoln2002:  0   irr:615   HH:615      no:615     FD10:  0  
 Iversen_121DefoliationHHFDFD10:  0   2014_2018:615   Lincoln2003:  0             LS:  0      No:  0     FD2 :  0  
 Iversen_121DefoliationHHFDFD2 :  0                   Lincoln2004:  0             SL:  0                 FD5 :615  
 Iversen_121DefoliationSSFDFD10:  0                   Lincoln2015:615             SS:  0                           
 Iversen_121DefoliationSSFDFD2 :  0                   Lincoln2016:  0                                              
 Iversen_121DefoliationSSFDFD5 :  0                                                                                
 (Other)                       :  0                                                                                
  GrowthSeason      Rotation       StartDate             MidDate             FinishDate            Interval    
 Min.   :1.000   Min.   :1.000   Min.   :2014-11-03   Min.   :2014-12-16   Min.   :2015-01-29   Min.   : 0.00  
 1st Qu.:1.000   1st Qu.:1.000   1st Qu.:2015-04-30   1st Qu.:2015-03-13   1st Qu.:2015-09-01   1st Qu.: 0.00  
 Median :2.000   Median :2.000   Median :2016-02-26   Median :2016-04-05   Median :2016-05-15   Median :41.00  
 Mean   :2.366   Mean   :2.171   Mean   :2016-04-26   Mean   :2016-05-27   Mean   :2016-07-22   Mean   :41.73  
 3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:2017-04-21   3rd Qu.:2017-06-03   3rd Qu.:2017-07-16   3rd Qu.:80.00  
 Max.   :4.000   Max.   :4.000   Max.   :2018-04-21   Max.   :2018-05-31   Max.   :2018-07-10   Max.   :98.00  
                                                                                                               
         Variable      VariableUnits   Period     Clock.Today               Time        Observed          StdDEV      
 shootbiomass:615   kg/ha     :615   02_03:  0   Min.   :2014-11-03   12:00:00:615   Min.   :   0.0   Min.   :  0.00  
 RootWt      :  0   %         :  0   03_04:  0   1st Qu.:2015-06-18                  1st Qu.:   0.0   1st Qu.:  0.00  
                    cm        :  0   04_05:  0   Median :2016-05-15                  Median : 894.8   Median :  0.00  
                    Fraction  :  0   14_15:180   Mean   :2016-06-03                  Mean   :2004.4   Mean   : 47.74  
                    fractional:  0   15_16:165   3rd Qu.:2017-04-21                  3rd Qu.:3158.0   3rd Qu.:  0.00  
                    franction :  0   16_17:135   Max.   :2018-04-21                  Max.   :9710.6   Max.   :673.38  
                    (Other)   :  0   17_18:135                                                                        
 ExperimentID   Treatment          ID      GrowthSeason1   Rotation1                                  ExpUnitCode 
 E3:  0       IHHF5  :615   E5IHHF5 :615   Gs_1:180      Rt_1   :225   Iversen_121DefoliationHHFDFD5Gs_1Rt_1: 90  
 E5:615       IHHF10 :  0   E3ILS   :  0   Gs_2:165      Rt_2   :150   Iversen_121DefoliationHHFDFD5Gs_1Rt_2: 45  
              IHHF2  :  0   E3ISL   :  0   Gs_3:135      Rt_3   :150   Iversen_121DefoliationHHFDFD5Gs_1Rt_3: 45  
              ILS    :  0   E3ISS   :  0   Gs_4:135      Rt_4   : 90   Iversen_121DefoliationHHFDFD5Gs_2Rt_1: 45  
              ISL    :  0   E5IHHF10:  0   Gs_5:  0      Rt_10  :  0   Iversen_121DefoliationHHFDFD5Gs_2Rt_2: 45  
              ISS    :  0   E5IHHF2 :  0                 Rt_5   :  0   Iversen_121DefoliationHHFDFD5Gs_2Rt_3: 45  
              (Other):  0   (Other) :  0                 (Other):  0   (Other)                              :300  
  Clock.Today1                   GrowthSeason2   Rotation2   GrowthRotation         Shoot      
 Min.   :2014-11-03 12:00:00   Y1(14_15):180   R1     :225   Length:615         Min.   : 2115  
 1st Qu.:2015-06-18 12:00:00   Y2(15_16):165   R2     :150   Class :character   1st Qu.:37714  
 Median :2016-05-15 12:00:00   Y3(16_17):135   R3     :150   Mode  :character   Median :74276  
 Mean   :2016-06-04 09:40:58   Y4(17_18):135   R4     : 90                      Mean   :58547  
 3rd Qu.:2017-04-21 12:00:00   Y1(02_03):  0   R10    :  0                      3rd Qu.:82182  
 Max.   :2018-04-21 12:00:00   Y1(15_16):  0   R5     :  0                      Max.   :82182  
                               (Other)  :  0   (Other):  0                                     
df.all

load Root and shoot data for SS

obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E5ISSFD5<-obsDSR%>%
  filter(ID=="E5ISSF5")
E5ISSFD5%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E5ISSF5"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E5ISSF5.png", width=8, height=6, dpi=500)

load Root and shoot data for LL

ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E5ILLF5<-ObsRS1%>%
  filter(ID=="E5ILLF5")
E5ILLF5%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
  geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
  facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
  #remove grid lines 
   theme(
     panel.spacing=unit(.01, "lines"),
     panel.border = element_rect(colour = "black",size=1), 
     panel.grid.major = element_blank(),
     panel.grid.minor = element_blank(),
     axis.line = element_line(colour = "black",size = 1),
     axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
     axis.text.y = element_text(face = "plain", color = "black", size = 14),
     axis.title.x=element_text(face="bold",colour="black",size = 14),
     axis.title.y=element_text(face="bold",colour="black",size = 14),
     strip.background = element_rect(colour = "black", fill = "white",size=1),
     strip.text.x = element_text(size=14, angle=0, face = "plain"), 
     strip.text.y = element_text(size=14, face="plain"),
     legend.title = element_text(colour="black", size=14, face="bold"),
     axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)

load Root data analysis data frame

upDir <- "D:/R/"
Rootdf <- "D:/R/CombinedData/"
Root.df<- read.table(paste0(Rootdf, "Root.dataframe.txt"),
               header = TRUE)
Root.dfA <- Root.df %>% mutate(Clock.Today=dmy(Clock.Today),
                               StartDate=dmy(StartDate),FinishDate=dmy(FinishDate),
                               StartDate1=dmy(StartDate1),FinishDate1=dmy(FinishDate1))%>%
   mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))

Remoblisation

Root.HH<-Root.dfA%>%
  dplyr::filter(Name==c("Iversen_121DefoliationHHFDFD5"))%>%
  dplyr::filter(Trend=="RB")
Root.HH1<-Root.HH%>%
  ggplot(aes(x=IRW,y=ChangeWt, colur=Name))+geom_point(size=2)+theme_bw()+mytheme3
Root.LL<-Root.dfA%>%
  dplyr::filter(Name==c("Iversen_91DefoliationLL"))%>%
  dplyr::filter(Trend=="RB")
Root.HH.graph<-Root.dfA%>%
  dplyr::filter(ID==c("E5IHHF5"))%>%
  ggplot(aes(x=Clock.Today,y=RootWt))+geom_line(size=1.5)+theme_bw()+mytheme3
ggsave("D:/R/Pictures/C5/Yield//SimpleE3HH.png", width=8, height=4, dpi=500)

remoblisation DM and structural DM

Root.LL1<-Root.dfA%>%
  dplyr::filter(Name==c("Iversen_121DefoliationLLFDFD5"))%>%
 dplyr::filter(Trend=="RB")
Root.LL1a<-Root.LL1%>%
  ggplot(aes(x=IRW,y=ChangeWt, colur=Name))+geom_point(size=2)+theme_bw()+mytheme3
ReRoot<-rbind(Root.HH,Root.LL,Root.LL1)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(ReRoot){
  m <- lm(ChangeWt~IRW , ReRoot);
  eq <- substitute(italic(y) == IRW + ChangeWt %.% italic(IRW)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        ChangeWt = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs <- ddply(ReRoot,.(Trend),lm_eqn1)
ReRoot%>%
  ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
  geom_text(data = eqs, aes(x =7000, y =7000, label = V1), 
          color = 'black',  parse = TRUE)+
  ggtitle("Remoblisation potential")

 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//RemoblisationHL.png", width=8, height=6, dpi=500)

remoblisation rate

ReRoot.Rate<-ReRoot%>%
  mutate(Re.rate=ChangeWt/ChangeTt)%>%
  mutate(Re.rate.Pp=Re.rate/ChangePp)
ReRoot.Rate%>%
  ggplot(aes(x=IRW,y=Re.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")

Root.LS<-Root.dfA%>%
  dplyr::filter(Name==c("Iversen_91DefoliationLS"))%>%
dplyr::filter(Trend=="RB")
Root.SL<-Root.dfA%>%
  dplyr::filter(Name==c("Iversen_91DefoliationSL"))%>%
  dplyr::filter(Trend=="RB")
Root.SS<-Root.dfA%>%
  dplyr::filter(Name==c("Iversen_91DefoliationSS"))%>%
  dplyr::filter(Trend=="RB")
Root.SSa<-Root.dfA%>%
  dplyr::filter(Name==c("Iversen_121DefoliationSSFDFD5"))%>%
  dplyr::filter(Trend=="RB")
RootSS<-rbind(Root.LS,Root.SL,Root.SS,Root.SSa)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(RootSS){
  m <- lm(ChangeWt~IRW , RootSS);
  eq <- substitute(italic(y) == IRW + ChangeWt %.% italic(IRW)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        ChangeWt = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs1 <- ddply(RootSS,.(Trend),lm_eqn1)
RootSS%>%
  ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs1, aes(x =4000, y =2500, label = V1), 
          color = 'black',  parse = TRUE)

 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Remoblisationss.png", width=8, height=6, dpi=500)
Root.dfA1<-Root.dfA%>%
     dplyr::filter(Trend=="RB")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfA1){
  m <- lm(ChangeWt~IRW , Root.dfA1);
  eq <- substitute(italic(y) == IRW + ChangeWt %.% italic(IRW)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        ChangeWt = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs1 <- ddply(Root.dfA1,.(Trend),lm_eqn1)
Root.dfA1%>%
  ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs1, aes(x =6000, y =6000, label = V1), 
          color = 'black',  parse = TRUE)
 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//RemoblisationALL.png", width=8, height=6, dpi=500)

Root.dfA1<-Root.dfA%>%
     dplyr::filter(Trend=="RB")%>%
  mutate(Per=ChangeWt/IRW)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfA1){
  m <- lm(Per~IRW , Root.dfA1);
  eq <- substitute(italic(y) == IRW + Per %.% italic(IRW)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        Per = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs11 <- ddply(Root.dfA1,.(Trend),lm_eqn1)
Root.dfA1%>%
  ggplot(aes(x=IRW,y=Per, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab("Remoblisation lost(%)")+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs11, aes(x =6000, y =0.75, label = V1), 
          color = 'black',  parse = TRUE)
 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//RemoblisationALLper.png", width=8, height=6, dpi=500)

Root.dfA1<-Root.dfA%>%
     dplyr::filter(Trend=="RB")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
my.formula  <- function(Root.dfA1){
  my.formula <- ChangeWt ~ poly(IRW, 2, raw = TRUE)
  m <- lm(my.formula, Root.dfA1)
  my.eq <- as.character(signif(as.polynomial(coef(m)), 2))
  label.text <- paste("y","'='",paste(gsub("y", "~italic(x)",my.eq, fixed = TRUE)),
              paste("italic(R)^2",format(summary(m)$r.squared, digits = 2), 
                    sep = "~`=`~"),
                    sep = "~~~~")
  as.character(as.expression(label.text));                 
}
my.eqs <- ddply(Root.dfA1,.(FD),my.formula)
b<-Root.dfA1%>%
  ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
  geom_smooth(method = "lm", se = TRUE, formula=y ~ poly(x, 2, raw=TRUE), colour="darkgrey")+
  theme(legend.title = element_blank())
b+geom_text(data = my.eqs, aes(x = 6000, y = 6000, label = V1), 
          color = 'black',  parse = TRUE, size=4)
  
 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield/RemoblisationALLploy2.png", width=8, height=6, dpi=500)

Root.dfA1<-Root.dfA%>%
     dplyr::filter(Trend=="RB")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
my.formula  <- function(Root.dfA1){
  my.formula <- ChangeWt ~ poly(IRW, 3, raw = TRUE)
  m <- lm(my.formula, Root.dfA1)
  my.eq <- as.character(signif(as.polynomial(coef(m)), 2))
  label.text <- paste("y","'='",paste(gsub("y", "~italic(x)",my.eq, fixed = TRUE)),
              paste("italic(R)^2",format(summary(m)$r.squared, digits = 2), 
                    sep = "~`=`~"),
                    sep = "~~~~")
  as.character(as.expression(label.text));                 
}
my.eqs <- ddply(Root.dfA1,.(FD),my.formula)
b<-Root.dfA1%>%
  ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
  geom_smooth(method = "lm", se = TRUE, formula=y ~ poly(x, 3, raw=TRUE), colour="darkgrey")+
  theme(legend.title = element_blank())
b+geom_text(data = my.eqs, aes(x = 6800, y = 6000, label = V1), 
          color = 'black',  parse = TRUE, size=4)
  
 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//RemoblisationALLploy3.png", width=8, height=6, dpi=500)

remoblisation rate

Root.dfALL<-Root.dfA1%>%
  mutate(Re.rate=ChangeWt/ChangeTt)%>%
  mutate(Re.rate.Pp=Re.rate/ChangePp)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfALL){
  m <- lm(Re.rate~IRW , Root.dfALL);
  eq <- substitute(italic(y) == IRW + Re.rate %.% italic(IRW)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        Re.rate = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs11 <- ddply(Root.dfALL,.(Trend),lm_eqn1)
Root.dfALL%>%
ggplot(aes(x=IRW,y=Re.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+
  xlab(bquote(bold('Intial root biomass ('*kg~ha^-1*')')))+ylab(bquote(bold('Remoblisation  rate ('*kg~cd^-1*')')))+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs11, aes(x =6000, y =4, label = V1), 
          color = 'black',  parse = TRUE)
 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Remoblisation rate.png", width=8, height=6, dpi=500)

root respiration rate SS

RootSS.Rate<-RootSS%>%
  mutate(Re.rate=ChangeWt/ChangeTt)%>%
  mutate(Re.rate.Pp=Re.rate/ChangePp)
RootSS.Rate%>%
  ggplot(aes(x=IRW,y=Re.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")

when partitioning start? Pp

Root.PT<-Root.dfA%>%
  filter(Trend=="PT")%>%
  mutate(Pt.rate=ChangeWt/ChangeTt)%>%
  mutate(Pt.rate.Pp=Pt.rate/ChangePp)%>%
  mutate(PTR=ChangeWt/IRW)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.PT){
  m <- lm(HRW~IRW , Root.PT);
  eq <- substitute(italic(y) == IRW+ HRW %.% italic(IRW)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        HRW = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs12 <- ddply(Root.PT,.(Trend),lm_eqn1)
Root.PT%>%
  ggplot(aes(x=IRW,y=HRW, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging potential ")+
  xlab(bquote(bold('Inital root biomass ('*kg~ha^-1*')')))+ylab(bquote(bold('Maximum root bomass ('*kg~ha^-1*')')))+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs12, aes(x =4000, y =8800, label = V1), 
          color = 'black',  parse = TRUE)
 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Rechanging potential.png", width=8, height=6, dpi=500)

when partitioning start? Pp

Recharging rate

Root.PT<-Root.dfA%>%
  filter(Trend=="PT")%>%
  mutate(Pt.rate=ChangeWt/ChangeTt)%>%
  mutate(Pt.rate.Pp=Pt.rate/ChangePp)%>%
  mutate(PTR=ChangeWt/IRW)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.PT){
  m <- lm(HRW~Pt.rate , Root.PT);
  eq <- substitute(italic(y) == Pt.rate+ HRW %.% italic(Pt.rate)*","~~italic(R)^2~"="~r2, 
                   list(Pt.rate= format(coef(m)[1], digits = 2), 
                        HRW = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs12 <- ddply(Root.PT,.(Trend),lm_eqn1)
Root.PT%>%
  ggplot(aes(x=Pt.rate,y=HRW, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging rate ")+
  xlab(bquote(bold('Recharging rate ('*kg~cd^-1*')')))+ylab(bquote(bold('Maximum root bomass ('*kg~ha^-1*')')))+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs12, aes(x =2, y =8800, label = V1), 
          color = 'black',  parse = TRUE)
 detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Rechanging rate.png", width=8, height=6, dpi=500)

RootPT in LL and HH

Root.PTLH<-Root.PT%>%
  dplyr::filter(ID!="E3ILL")%>%
  dplyr::filter(ID!="E5ILLF5")%>% 
  dplyr::filter(ID!="E5IHHF5")
Root.PTLH%>%
  ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging potential")

  #geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")
Root.PTLH%>%
  ggplot(aes(x=IRW,y=Pt.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging potential")

  #geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")

Respiration Rate and intial biomass

Root.dfR<-Root.dfA%>%
  filter(Trend=="RP")%>%
  mutate(RP.rate=ChangeWt/ChangeTt)%>%
  mutate(GrowthRotation=paste(GrowthSeason,Rotation))
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfR){
  m <- lm(RP.rate~IRW , Root.dfR);
  eq <- substitute(italic(y) == IRW+ RP.rate %.% italic(RP.rate)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        RP.rate = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs12 <- ddply(Root.dfR,.(Trend),lm_eqn1)
detach(package:plyr)
Root.dfR%>%
  ggplot(aes(x=IRW, y=RP.rate,color=ID,label=GrowthRotation))+geom_text()+theme_bw()+mytheme3+
  xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Repiration rate ('*kg~Cd^-1*')')))+ggtitle("Respiration in Winter")+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs12, aes(y=6, x =5000, label = V1),
          color = 'black',  parse = TRUE)

 ggsave("D:/R/Pictures/C5/Yield/Respiartion rate.png", width=8, height=4, dpi=500)
 write.csv(Root.dfR,"D:/R/Respiration/Root.dfR.csv", row.names = FALSE)
  

respiration and structural root biomass

structural root is percentage of total root biomass

Root.dfper<-Root.dfA%>%
  filter(Trend=="RP")%>%
  mutate(Per=1-ChangeTt/IRW)%>%
   mutate(GrowthRotation=as.factor(paste(GrowthSeason,Rotation)))%>%
  dplyr::filter(GrowthSeason!="2"|Rotation!="10")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------

Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:

    here

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn11 <- function(Root.dfper){
  m <- lm(ChangeWt~IRW , Root.dfper);
  eq <- substitute(italic(y) == IRW+ ChangeWt %.% italic(ChangeWt)*","~~italic(R)^2~"="~r2, 
                   list(IRW= format(coef(m)[1], digits = 2), 
                        ChangeWt = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}
eqs13 <- ddply(Root.dfper,.(Trend),lm_eqn11)
detach(package:plyr)
Root.dfper%>%
  ggplot(aes(x=IRW, y=ChangeWt,color=ID,label=GrowthRotation))+geom_text()+theme_bw()+mytheme3+
  xlab(bquote(bold('Initial root biomass ('*kg~ha^-1*')')))+ylab(bquote(bold('Root respiration ('*kg~ha^-1*')')))+ggtitle("Respiration in Winter")+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
  geom_text(data = eqs13, aes(y=2000, x =6000, label = V1),
          color = 'black',  parse = TRUE)
 ggsave("D:/R/Pictures/C5/Yield/rootsturctural.png", width=8, height=4, dpi=500)

 #write.csv(Root.dfR,"D:/R/Respiration/Root.dfR.csv", row.names = FALSE)
 ###structural root biomass=2491.30

daily winter respiration

upDir <- "D:/R/"
Rootdf <- "D:/R/Respiration/"
RootResp<- read.table(paste0(Rootdf, "RootResp.txt"),
               header = TRUE)
Root.resp <- RootResp %>% mutate(Clock.Today=dmy(Clock.Today))%>%
  filter(FinialRW!="NA")%>%
  dplyr::select(Name,Clock.Today,Tearth,GrowthRotation,FinialRW,Rm_root_day1,Rm_root_day2,Rm_root_day3, Rm_root_day4, Rm_root_day5,Rm_root_day6,Rm_root_day7,Rm_root_day8,Rm_root_day9,Rm_root_day10) %>%
  tidyr::gather("Variable","Predicted",Rm_root_day1:Rm_root_day10)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
Root.resp$Variable<- factor(Root.resp$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10"))
Root.resp%>%
  ggplot(aes(x=FinialRW, y= Predicted, colour= factor(Name))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Root biomass")+
  facet_wrap(~Variable, ncol = 4)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed")+ggtitle("Respiration in Winter")+ theme(legend.title=element_blank(),legend.position = "blank")

 ggsave("D:/R/Pictures/C5/Yield/Rm_root_day.png", width=8, height=8, dpi=500)

Define stats function

Test stats functions used

s <- c(4231.972,3935.604,3779.652,3627.687,3363.499,3230.566,2868.114,2868.827)
m <- c(4987.66,5636.09,4754.06,4114.53,4141.72,3704.06,5142.19,4762.03)
x <- gauchStats(s,m)
tempDf <- data.frame(statName=c("SB","NU","LC","r_MSD","R2"), statValue=x)
# kable(tempDf, digits= 2)
tempDf2 <- data.frame(Predicted=s, Observed=m)
x <- tempDf2 %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) %>% 
  t() 
df <- data.frame(stat = row.names(x),statvalue = x[,1])
df %>%
  kable(format = "markdown")
stat statvalue
n n 8.0
r2 r2 7.1
r_rmse r_rmse 28.7
nse nse -4.1
sb sb 76.5
nu nu 5.2
lc lc 18.2
Root.resp$Variable<- factor(Root.resp$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10"))
Root.resp %>%
  mutate(Observed=FinialRW)%>%
   #filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.013,0.015, 0.02, 0.025,0.028, 0.03, 0.035,0.04,(0.045),0.05

daily winter respiration with structural root biomass

upDir <- "D:/R/"
Rootdf <- "D:/R/Respiration/"
RootResp<- read.table(paste0(Rootdf, "RootRespStru.txt"),
               header = TRUE)
Root.resp.stru <- RootResp %>% mutate(Clock.Today=dmy(Clock.Today))%>%
  filter(FinialRW!="NA")%>%
  dplyr::select(Name,Clock.Today,Tearth,GrowthRotation,FinialRW,Rm_root_day1,Rm_root_day2,Rm_root_day3, Rm_root_day4, Rm_root_day5,Rm_root_day6,Rm_root_day7,Rm_root_day8,Rm_root_day9,Rm_root_day10,Rm_root_day11,Rm_root_day12,Rm_root_day13,Rm_root_day14,Rm_root_day15,Rm_root_day16,Rm_root_day17,Rm_root_day18,Rm_root_day19,Rm_root_day20) %>%
  tidyr::gather("Variable","Predicted",Rm_root_day1:Rm_root_day20)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
Root.resp.stru$Variable<- factor(Root.resp.stru$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10","Rm_root_day11","Rm_root_day12","Rm_root_day13","Rm_root_day14","Rm_root_day15","Rm_root_day16","Rm_root_day17","Rm_root_day18","Rm_root_day19","Rm_root_day20"))
Root.resp.stru%>%
  ggplot(aes(x=FinialRW, y= Predicted, colour= factor(Name))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Root biomass")+
  facet_wrap(~Variable, ncol = 5)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed")+ggtitle("Respiration in Winter")+ theme(legend.title=element_blank(),legend.position = "blank")

 ggsave("D:/R/Pictures/C5/Yield/Rm_root_dayStru.png", width=8, height=10, dpi=500)

analysis

Root.resp.stru$Variable<- factor(Root.resp.stru$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10","Rm_root_day11","Rm_root_day12","Rm_root_day13","Rm_root_day14","Rm_root_day15","Rm_root_day16","Rm_root_day17","Rm_root_day18","Rm_root_day19","Rm_root_day20"))
Root.resp.stru %>%
  mutate(Observed=FinialRW)%>%
   #filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.013,0.018, 0.02, 0.025, 0.03, 0.035, 0.04, 0.045, 0.05, 0.055, 0.06, 0.065, 0.07, 0.075, 0.08, (0.085),0.09,0.095,0.1, 0.15.

New ananlysis

Interpuolate PARi

load data

upDir <- "D:/R/CombinedData/"
obsData <- "D:/R/CombinedData/"
Rootmet <- read.table(paste0(obsData, "RootMet.txt"),
                   header = TRUE) %>%
  dplyr::filter(ExpName!="Iversen_91DefoliationLSGs_1Rt_8")%>%
  dplyr::filter(ExpName!="Iversen_121DefoliationLLFDFD5Gs_3Rt_6")

Interpoluate

Interpolate temperature factor

# Create a TT linear interpolation function
# Aim: Interpolates linearly between two known x-y pairs
int_func <- function(temp,TT,temp_ref){
# if temp is too low or too high give extreme TT values
 if(temp_ref>temp[length(temp)]) {
   
   out <- TT[length(TT)] 
   
 } else if (temp_ref<temp[1]) {
   
   out <- TT[1]
   
 } else {
   
# else interpolate
   
   tryCatch(  
   
  out <- approx(temp, TT, xout = temp_ref, 
         method="linear", 
         rule = 2)$y,
  error = function(e) 
  {
  out <- NA
  }
) 
  
} # end if check
  return(out)  
  
 }
  
# Test and test interpolation function 
# Set an input cardinal temperature df
tt_card <- data.frame(x_ref=c(1.0,  5.0,  10,  15,  30,  40),
                      y_ref=c(0.0,  3.0,  6.5, 10,  25,  0.0))
temp_ref  <- 25 # random input x-axes value to test
temp <- tt_card$x_ref # x-axes
TT <- tt_card$y_ref # y-axes
int_func(temp,TT,temp_ref) # result must be 20
[1] 20

interpoluate as x and y pairs

t_factor <- data.frame(x_ref=c(0.0, 18,  30,  40),
                        y_ref=c(0.0, 1.0,  1.0,  0.0))
  
  
Tem.factor<-Rootmet %>%
  mutate(T.factor=int_func(t_factor$x_ref,t_factor$y_ref, mean))%>%
  #mutate(potentialProduction=PARi*16.2*T.factor)%>%     ###RUE =1.62
  mutate(Clock.Today=dmy(Clock.Today))%>%
  mutate(ExpUnitCode=as.factor(ExpName))
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used
  
                                       
Tem.factor  
write.csv(Tem.factor ,"D:/R/Respiration/Tem.factor.csv", row.names = FALSE)

fPAR interpolate for each rotation

RUE testing

UniExp <- unique(Tem.factor$ExpName)
fPAR.df <- data.frame()
  
for(i in 1:length(UniExp))
{
  
 RootmetfPAR<-Tem.factor %>%
   filter(ExpName==UniExp[i])%>%
  mutate(Tt_broken_sum=as.numeric(Tt_broken_sum))
  
 fPAR.data<-RootmetfPAR%>%
  mutate(fPAR=approx(Tt_broken_sum, Franction, xout =Tt_broken_sum, 
         method="linear", 
         rule = 2)$y)%>%     ##interpolate function 
 mutate(PARi=radn*fPAR)%>% 
    unique()%>%
     ##accmulated function
 mutate(Production.day0 = PARi*7.2*T.factor)%>%               ###RUE is 0.72g/MJ
 mutate(Production.sum0 = cumsum(Production.day0))%>%
 mutate(Production.day1 = PARi*7.7*T.factor)%>%               ###RUE is 0.77g/MJ
 mutate(Production.sum1 = cumsum(Production.day1))%>%
 mutate(Production.day2 = PARi*8.2*T.factor)%>%               ###RUE is 0.82g/MJ
 mutate(Production.sum2 = cumsum(Production.day2))%>%
 mutate(Production.day3 = PARi*8.7*T.factor)%>%               ###RUE is 0.87g/MJ
 mutate(Production.sum3 = cumsum(Production.day3))%>%
 mutate(Production.day3A = PARi*8.8*T.factor)%>%               ###RUE is 0.88g/MJ
 mutate(Production.sum3A = cumsum(Production.day3A))%>% 
 mutate(Production.day3B = PARi*8.9*T.factor)%>%               ###RUE is 0.89g/MJ
 mutate(Production.sum3B = cumsum(Production.day3B))%>%  
 mutate(Production.day3C = PARi*9.0*T.factor)%>%               ###RUE is 0.90g/MJ
 mutate(Production.sum3C = cumsum(Production.day3C))%>%    
 mutate(Production.day3D = PARi*9.1*T.factor)%>%               ###RUE is 0.91g/MJ
 mutate(Production.sum3D = cumsum(Production.day3D))%>% 
 mutate(Production.day4 = PARi*9.2*T.factor)%>%               ###RUE is 0.92g/MJ
 mutate(Production.sum4 = cumsum(Production.day4))%>%
 mutate(Production.day4A = PARi*9.3*T.factor)%>%               ###RUE is 0.93g/MJ
 mutate(Production.sum4A = cumsum(Production.day4A))%>% 
 mutate(Production.day4B = PARi*9.4*T.factor)%>%               ###RUE is 0.94g/MJ
 mutate(Production.sum4B = cumsum(Production.day4B))%>%  
 mutate(Production.day4C = PARi*9.5*T.factor)%>%               ###RUE is 0.95g/MJ
 mutate(Production.sum4C = cumsum(Production.day4C))%>%  
 mutate(Production.day4D = PARi*9.6*T.factor)%>%               ###RUE is 0.96g/MJ
 mutate(Production.sum4D = cumsum(Production.day4D))%>%  
 mutate(Production.day5 = PARi*9.7*T.factor)%>%               ###RUE is 0.97g/MJ
 mutate(Production.sum5 = cumsum(Production.day5))%>%
 mutate(Production.day6 = PARi*10.2*T.factor)%>%               ###RUE is 1.02g/MJ
 mutate(Production.sum6 = cumsum(Production.day6))%>% 
 mutate(Production.day7 = PARi*10.7*T.factor)%>%               ###RUE is 1.07g/MJ
 mutate(Production.sum7 = cumsum(Production.day7))%>%  
 mutate(Production.day7A = PARi*10.8*T.factor)%>%               ###RUE is 1.08g/MJ
 mutate(Production.sum7A = cumsum(Production.day7A))%>%  
 mutate(Production.day7B = PARi*10.9*T.factor)%>%               ###RUE is 1.09g/MJ
 mutate(Production.sum7B = cumsum(Production.day7B))%>% 
 mutate(Production.day7C = PARi*11.0*T.factor)%>%               ###RUE is 1.10g/MJ
 mutate(Production.sum7C = cumsum(Production.day7C))%>% 
 mutate(Production.day7D = PARi*11.1*T.factor)%>%               ###RUE is 1.11g/MJ
 mutate(Production.sum7D = cumsum(Production.day7D))%>% 
 mutate(Production.day8 = PARi*11.2*T.factor)%>%                ###RUE is 1.12g/MJ
 mutate(Production.sum8 = cumsum(Production.day8))%>%
 mutate(Production.day8A = PARi*11.3*T.factor)%>%               ###RUE is 1.13g/MJ
 mutate(Production.sum8A = cumsum(Production.day8A))%>%  
 mutate(Production.day8B = PARi*11.4*T.factor)%>%               ###RUE is 1.14g/MJ
 mutate(Production.sum8B = cumsum(Production.day8B))%>% 
 mutate(Production.day8C = PARi*11.5*T.factor)%>%               ###RUE is 1.15g/MJ
 mutate(Production.sum8C = cumsum(Production.day8C))%>% 
 mutate(Production.day8D = PARi*11.6*T.factor)%>%               ###RUE is 1.16g/MJ
 mutate(Production.sum8D = cumsum(Production.day8D))%>% 
 mutate(Production.day9  = PARi*11.7*T.factor)%>%                ###RUE is 1.17g/MJ
 mutate(Production.sum9  = cumsum(Production.day9))%>%  
 mutate(Production.day9A = PARi*11.8*T.factor)%>%               ###RUE is 1.18g/MJ
 mutate(Production.sum9A = cumsum(Production.day9A))%>%  
 mutate(Production.day9B = PARi*11.9*T.factor)%>%               ###RUE is 1.19g/MJ
 mutate(Production.sum9B = cumsum(Production.day9B))%>% 
 mutate(Production.day9C = PARi*12.0*T.factor)%>%               ###RUE is 1.20g/MJ
 mutate(Production.sum9C = cumsum(Production.day9C))%>% 
 mutate(Production.day9D = PARi*12.1*T.factor)%>%               ###RUE is 1.21g/MJ
 mutate(Production.sum9D = cumsum(Production.day9D))%>% 
 mutate(Production.day10 = PARi*12.2*T.factor)%>%               ###RUE is 1.22g/MJ
 mutate(Production.sum10 = cumsum(Production.day10))%>%
 mutate(Production.day11 = PARi*12.7*T.factor)%>%               ###RUE is 1.27g/MJ
 mutate(Production.sum11 = cumsum(Production.day11))%>%
 mutate(Production.day12 = PARi*13.2*T.factor)%>%               ###RUE is 1.32g/MJ
 mutate(Production.sum12 = cumsum(Production.day12))%>%
 mutate(Production.day13 = PARi*13.7*T.factor)%>%               ###RUE is 1.37g/MJ
 mutate(Production.sum13 = cumsum(Production.day13))%>%
 mutate(Potentialroot1 = PARi*1*T.factor)%>%
 mutate(Sumpotential1 = cumsum(Potentialroot1))%>%           ###RuE root is 0.1g/MJ
 mutate(Potentialroot2 = PARi*2*T.factor)%>%
 mutate(Sumpotential2 = cumsum(Potentialroot2))%>%           ####RUE root is 0.2g/MJ
 mutate(Potentialroot3 = PARi*2.4*T.factor)%>%
 mutate(Sumpotential3 = cumsum(Potentialroot3))%>%           ####RUE root is 0.25g/MJ
 mutate(Potentialroot3A = PARi*2.5*T.factor)%>%
 mutate(Sumpotential3A = cumsum(Potentialroot3A))%>% 
 mutate(Potentialroot4 = PARi*3*T.factor)%>%
 mutate(Sumpotential4 = cumsum(Potentialroot4))%>%           ####RUE root is 0.3g/MJ
 mutate(Potentialroot5 = PARi*3.5*T.factor)%>%
 mutate(Sumpotential5 = cumsum(Potentialroot5))%>%           ####RUE root is 0.35g/MJ
 mutate(Potentialroot6 = PARi*4*T.factor)%>%
 mutate(Sumpotential6 = cumsum(Potentialroot6))%>%           ####RUE root is 0.4g/MJ
 mutate(AccPARi=cumsum(PARi))
 fPAR.df<- rbind( fPAR.df, fPAR.data)
}
summary(fPAR.df)
      year           day             rain             maxt            mint             mean            radn      
 Min.   :2002   Min.   :  1.0   Min.   : 0.000   Min.   : 3.10   Min.   :-6.200   Min.   : 0.00   Min.   : 0.40  
 1st Qu.:2003   1st Qu.: 91.0   1st Qu.: 0.000   1st Qu.:12.60   1st Qu.: 2.900   1st Qu.: 8.10   1st Qu.: 6.40  
 Median :2015   Median :183.0   Median : 0.000   Median :16.60   Median : 6.600   Median :11.70   Median :11.47  
 Mean   :2010   Mean   :181.7   Mean   : 1.526   Mean   :17.04   Mean   : 6.624   Mean   :11.80   Mean   :13.56  
 3rd Qu.:2016   3rd Qu.:268.0   3rd Qu.: 0.400   3rd Qu.:20.80   3rd Qu.:10.300   3rd Qu.:15.25   3rd Qu.:20.20  
 Max.   :2018   Max.   :366.0   Max.   :65.000   Max.   :35.00   Max.   :20.000   Max.   :25.20   Max.   :38.10  
                                                                                                                 
      wind              vp              Pp             Tbb       TTbroken           TTfick            TTbeta         
 Min.   : 0.000   Min.   : 5.40   Min.   :10.02   Min.   :1   Min.   : 0.5401   Min.   : 0.6519   Min.   : 0.003152  
 1st Qu.: 2.700   1st Qu.: 8.80   1st Qu.:10.92   1st Qu.:1   1st Qu.: 5.0739   1st Qu.: 6.1236   1st Qu.: 1.063950  
 Median : 3.700   Median :10.15   Median :12.88   Median :1   Median : 7.7761   Median : 9.2705   Median : 3.024918  
 Mean   : 3.837   Mean   :10.55   Mean   :13.08   Mean   :1   Mean   : 8.2006   Mean   : 9.4586   Mean   : 4.416565  
 3rd Qu.: 4.800   3rd Qu.:11.90   3rd Qu.:15.20   3rd Qu.:1   3rd Qu.:10.9271   3rd Qu.:12.4425   3rd Qu.: 6.639466  
 Max.   :12.500   Max.   :19.90   Max.   :16.65   Max.   :1   Max.   :20.2195   Max.   :20.8706   Max.   :21.944348  
                                                                                                                     
       Experiment   Water      Defoliation SowingDate   FD       GrowthSeason    Rotation         StartDate          MidDate    
 Lincoln2002:3334   irr:6836   HH:1173     no:3502    FD5:6836   Gs_1:2036    Rt_1   :1950   14/06/2002: 418   7/08/2004 : 342  
 Lincoln2003:   0              LL:1976     No:3334    FD6:   0   Gs_2:2359    Rt_3   : 931   12/06/2004: 342   9/08/2003 : 230  
 Lincoln2015:3502              LS: 804                           Gs_3:1376    Rt_2   : 923   13/06/2003: 327   9/08/2002 : 228  
                               SL: 843                           Gs_4: 991    Rt_4   : 785   4/09/2015 : 168   2/12/2017 : 184  
                               SS:2040                           Gs_5:  74    Rt_6   : 583   17/07/2017: 167   31/05/2018: 163  
                                                                              Rt_5   : 488   19/10/2017: 164   10/06/2017: 125  
                                                                              (Other):1176   (Other)   :5250   (Other)   :5564  
      FinishDate                              ExpName      Clock.Today          Tt_beta_sum        Tt_fick_sum      
 3/10/2004 : 342   Iversen_91DefoliationSSGs_3Rt_1: 118   Min.   :2002-06-14   Min.   :  0.2834   Min.   :   3.546  
 5/10/2003 : 230   Iversen_91DefoliationLLGs_2Rt_1: 115   1st Qu.:2003-08-24   1st Qu.: 39.0997   1st Qu.: 116.814  
 5/10/2002 : 228   Iversen_91DefoliationLSGs_2Rt_1: 115   Median :2015-01-25   Median : 80.1156   Median : 225.262  
 10/07/2018: 163   Iversen_91DefoliationLLGs_1Rt_1: 114   Mean   :2010-05-15   Mean   :117.1140   Mean   : 269.455  
 20/04/2018: 138   Iversen_91DefoliationLLGs_3Rt_1: 114   3rd Qu.:2016-11-10   3rd Qu.:145.5871   3rd Qu.: 369.084  
 11/07/2017: 125   Iversen_91DefoliationLSGs_1Rt_1: 114   Max.   :2018-08-24   Max.   :829.8554   Max.   :1273.027  
 (Other)   :5610   (Other)                        :6146                                                             
 Tt_broken_sum           Ppm            Tmean             LAI          Franction         Tearth      ExperimentID TreatmentID 
 Min.   :   2.938   Min.   :10.18   Min.   : 6.714   Min.   :0.000   Min.   :0.000   Min.   : 1.20   E3:3334      IHHF5:1173  
 1st Qu.:  99.701   1st Qu.:11.30   1st Qu.: 7.954   1st Qu.:0.000   1st Qu.:0.000   1st Qu.: 7.90   E5:3502      ILL  : 843  
 Median : 193.896   Median :12.65   Median :11.618   Median :0.910   Median :0.522   Median :12.21                ILLF5:1133  
 Mean   : 232.550   Mean   :13.08   Mean   :11.800   Mean   :1.546   Mean   :0.486   Mean   :12.62                ILS  : 804  
 3rd Qu.: 317.337   3rd Qu.:15.04   3rd Qu.:15.100   3rd Qu.:2.585   3rd Qu.:0.878   3rd Qu.:17.13                ISL  : 843  
 Max.   :1139.887   Max.   :16.61   Max.   :19.460   Max.   :7.485   Max.   :0.998   Max.   :26.76                ISS  : 844  
                                                     NA's   :6049    NA's   :6049                                 ISSF5:1196  
       ID          T.factor                               ExpUnitCode        fPAR             PARi         Production.day0  
 E3ILL  : 843   Min.   :0.0000   Iversen_91DefoliationSSGs_3Rt_1: 118   Min.   :0.0000   Min.   : 0.0000   Min.   :  0.000  
 E3ILS  : 804   1st Qu.:0.4500   Iversen_91DefoliationLLGs_2Rt_1: 115   1st Qu.:0.1004   1st Qu.: 0.7003   1st Qu.:  1.896  
 E3ISL  : 843   Median :0.6500   Iversen_91DefoliationLSGs_2Rt_1: 115   Median :0.3876   Median : 3.8392   Median : 16.384  
 E3ISS  : 844   Mean   :0.6428   Iversen_91DefoliationLLGs_1Rt_1: 114   Mean   :0.4376   Mean   : 6.9688   Mean   : 38.392  
 E5IHHF5:1173   3rd Qu.:0.8472   Iversen_91DefoliationLLGs_3Rt_1: 114   3rd Qu.:0.7799   3rd Qu.:11.1173   3rd Qu.: 59.178  
 E5ILLF5:1133   Max.   :1.0000   Iversen_91DefoliationLSGs_1Rt_1: 114   Max.   :0.9977   Max.   :36.3199   Max.   :239.807  
 E5ISSF5:1196                    (Other)                        :6146                                                       
 Production.sum0    Production.day1   Production.sum1    Production.day2  Production.sum2    Production.day3  
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.00   Min.   :    0.00   Min.   :  0.000  
 1st Qu.:   24.98   1st Qu.:  2.028   1st Qu.:   26.71   1st Qu.:  2.16   1st Qu.:   28.45   1st Qu.:  2.291  
 Median :  206.49   Median : 17.522   Median :  220.83   Median : 18.66   Median :  235.17   Median : 19.797  
 Mean   :  824.72   Mean   : 41.058   Mean   :  881.99   Mean   : 43.72   Mean   :  939.26   Mean   : 46.391  
 3rd Qu.:  998.45   3rd Qu.: 63.288   3rd Qu.: 1067.79   3rd Qu.: 67.40   3rd Qu.: 1137.13   3rd Qu.: 71.507  
 Max.   :11047.53   Max.   :256.460   Max.   :11814.72   Max.   :273.11   Max.   :12581.91   Max.   :289.766  
                                                                                                              
 Production.sum3    Production.day3A  Production.sum3A   Production.day3B  Production.sum3B   Production.day3C
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.00  
 1st Qu.:   30.18   1st Qu.:  2.318   1st Qu.:   30.53   1st Qu.:  2.344   1st Qu.:   30.88   1st Qu.:  2.37  
 Median :  249.50   Median : 20.025   Median :  252.37   Median : 20.252   Median :  255.24   Median : 20.48  
 Mean   :  996.53   Mean   : 46.924   Mean   : 1007.99   Mean   : 47.457   Mean   : 1019.44   Mean   : 47.99  
 3rd Qu.: 1206.46   3rd Qu.: 72.329   3rd Qu.: 1220.33   3rd Qu.: 73.151   3rd Qu.: 1234.20   3rd Qu.: 73.97  
 Max.   :13349.10   Max.   :293.097   Max.   :13502.53   Max.   :296.428   Max.   :13655.97   Max.   :299.76  
                                                                                                              
 Production.sum3C   Production.day3D  Production.sum3D   Production.day4   Production.sum4    Production.day4A 
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000  
 1st Qu.:   31.22   1st Qu.:  2.397   1st Qu.:   31.57   1st Qu.:  2.423   1st Qu.:   31.92   1st Qu.:  2.449  
 Median :  258.11   Median : 20.707   Median :  260.98   Median : 20.935   Median :  263.84   Median : 21.162  
 Mean   : 1030.90   Mean   : 48.524   Mean   : 1042.35   Mean   : 49.057   Mean   : 1053.81   Mean   : 49.590  
 3rd Qu.: 1248.07   3rd Qu.: 74.794   3rd Qu.: 1261.93   3rd Qu.: 75.616   3rd Qu.: 1275.80   3rd Qu.: 76.438  
 Max.   :13809.41   Max.   :303.089   Max.   :13962.85   Max.   :306.420   Max.   :14116.28   Max.   :309.750  
                                                                                                               
 Production.sum4A   Production.day4B  Production.sum4B   Production.day4C  Production.sum4C   Production.day4D 
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000  
 1st Qu.:   32.26   1st Qu.:  2.476   1st Qu.:   32.61   1st Qu.:  2.502   1st Qu.:   32.96   1st Qu.:  2.528  
 Median :  266.71   Median : 21.390   Median :  269.58   Median : 21.617   Median :  272.45   Median : 21.845  
 Mean   : 1065.26   Mean   : 50.123   Mean   : 1076.71   Mean   : 50.657   Mean   : 1088.17   Mean   : 51.190  
 3rd Qu.: 1289.67   3rd Qu.: 77.260   3rd Qu.: 1303.54   3rd Qu.: 78.082   3rd Qu.: 1317.40   3rd Qu.: 78.904  
 Max.   :14269.72   Max.   :313.081   Max.   :14423.16   Max.   :316.412   Max.   :14576.60   Max.   :319.742  
                                                                                                               
 Production.sum4D  Production.day5   Production.sum5    Production.day6   Production.sum6    Production.day7  
 Min.   :    0.0   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000  
 1st Qu.:   33.3   1st Qu.:  2.555   1st Qu.:   33.65   1st Qu.:  2.686   1st Qu.:   35.38   1st Qu.:  2.818  
 Median :  275.3   Median : 22.073   Median :  278.18   Median : 23.210   Median :  292.52   Median : 24.348  
 Mean   : 1099.6   Mean   : 51.723   Mean   : 1111.08   Mean   : 54.389   Mean   : 1168.35   Mean   : 57.055  
 3rd Qu.: 1331.3   3rd Qu.: 79.726   3rd Qu.: 1345.14   3rd Qu.: 83.835   3rd Qu.: 1414.47   3rd Qu.: 87.945  
 Max.   :14730.0   Max.   :323.073   Max.   :14883.48   Max.   :339.726   Max.   :15650.66   Max.   :356.379  
                                                                                                              
 Production.sum7    Production.day7A  Production.sum7A   Production.day7B  Production.sum7B   Production.day7C 
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000  
 1st Qu.:   37.12   1st Qu.:  2.844   1st Qu.:   37.47   1st Qu.:  2.871   1st Qu.:   37.81   1st Qu.:  2.897  
 Median :  306.86   Median : 24.576   Median :  309.73   Median : 24.803   Median :  312.60   Median : 25.031  
 Mean   : 1225.62   Mean   : 57.589   Mean   : 1237.08   Mean   : 58.122   Mean   : 1248.53   Mean   : 58.655  
 3rd Qu.: 1483.81   3rd Qu.: 88.767   3rd Qu.: 1497.68   3rd Qu.: 89.589   3rd Qu.: 1511.55   3rd Qu.: 90.411  
 Max.   :16417.85   Max.   :359.710   Max.   :16571.29   Max.   :363.041   Max.   :16724.73   Max.   :366.371  
                                                                                                               
 Production.sum7C   Production.day7D  Production.sum7D   Production.day8  Production.sum8    Production.day8A  Production.sum8A 
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.00   Min.   :    0.00   Min.   :  0.000   Min.   :    0.0  
 1st Qu.:   38.16   1st Qu.:  2.923   1st Qu.:   38.51   1st Qu.:  2.95   1st Qu.:   38.85   1st Qu.:  2.976   1st Qu.:   39.2  
 Median :  315.47   Median : 25.258   Median :  318.33   Median : 25.49   Median :  321.20   Median : 25.713   Median :  324.1  
 Mean   : 1259.99   Mean   : 59.188   Mean   : 1271.44   Mean   : 59.72   Mean   : 1282.89   Mean   : 60.255   Mean   : 1294.3  
 3rd Qu.: 1525.41   3rd Qu.: 91.233   3rd Qu.: 1539.28   3rd Qu.: 92.05   3rd Qu.: 1553.15   3rd Qu.: 92.876   3rd Qu.: 1567.0  
 Max.   :16878.17   Max.   :369.702   Max.   :17031.60   Max.   :373.03   Max.   :17185.04   Max.   :376.363   Max.   :17338.5  
                                                                                                                                
 Production.day8B  Production.sum8B   Production.day8C  Production.sum8C  Production.day8D  Production.sum8D   Production.day9  
 Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.0   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000  
 1st Qu.:  3.002   1st Qu.:   39.55   1st Qu.:  3.029   1st Qu.:   39.9   1st Qu.:  3.055   1st Qu.:   40.24   1st Qu.:  3.081  
 Median : 25.941   Median :  326.94   Median : 26.169   Median :  329.8   Median : 26.396   Median :  332.67   Median : 26.624  
 Mean   : 60.788   Mean   : 1305.80   Mean   : 61.321   Mean   : 1317.3   Mean   : 61.854   Mean   : 1328.71   Mean   : 62.388  
 3rd Qu.: 93.698   3rd Qu.: 1580.88   3rd Qu.: 94.520   3rd Qu.: 1594.8   3rd Qu.: 95.342   3rd Qu.: 1608.62   3rd Qu.: 96.164  
 Max.   :379.694   Max.   :17491.92   Max.   :383.025   Max.   :17645.4   Max.   :386.355   Max.   :17798.79   Max.   :389.686  
                                                                                                                                
 Production.sum9    Production.day9A  Production.sum9A   Production.day9B  Production.sum9B   Production.day9C
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.00  
 1st Qu.:   40.59   1st Qu.:  3.108   1st Qu.:   40.94   1st Qu.:  3.134   1st Qu.:   41.28   1st Qu.:  3.16  
 Median :  335.54   Median : 26.851   Median :  338.41   Median : 27.079   Median :  341.28   Median : 27.31  
 Mean   : 1340.17   Mean   : 62.921   Mean   : 1351.62   Mean   : 63.454   Mean   : 1363.08   Mean   : 63.99  
 3rd Qu.: 1622.49   3rd Qu.: 96.986   3rd Qu.: 1636.35   3rd Qu.: 97.808   3rd Qu.: 1650.22   3rd Qu.: 98.63  
 Max.   :17952.23   Max.   :393.017   Max.   :18105.67   Max.   :396.347   Max.   :18259.11   Max.   :399.68  
                                                                                                              
 Production.sum9C   Production.day9D  Production.sum9D   Production.day10  Production.sum10   Production.day11 
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000  
 1st Qu.:   41.63   1st Qu.:  3.187   1st Qu.:   41.98   1st Qu.:  3.213   1st Qu.:   42.32   1st Qu.:  3.345  
 Median :  344.14   Median : 27.534   Median :  347.01   Median : 27.761   Median :  349.88   Median : 28.899  
 Mean   : 1374.53   Mean   : 64.520   Mean   : 1385.98   Mean   : 65.054   Mean   : 1397.44   Mean   : 67.720  
 3rd Qu.: 1664.09   3rd Qu.: 99.452   3rd Qu.: 1677.96   3rd Qu.:100.274   3rd Qu.: 1691.82   3rd Qu.:104.383  
 Max.   :18412.55   Max.   :403.009   Max.   :18565.98   Max.   :406.339   Max.   :18719.42   Max.   :422.992  
                                                                                                               
 Production.sum11   Production.day12  Production.sum12   Production.day13  Production.sum13   Potentialroot1   
 Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   :  0.000   Min.   :    0.00   Min.   : 0.0000  
 1st Qu.:   44.06   1st Qu.:  3.477   1st Qu.:   45.79   1st Qu.:  3.608   1st Qu.:   47.53   1st Qu.: 0.2634  
 Median :  364.22   Median : 30.037   Median :  378.56   Median : 31.175   Median :  392.90   Median : 2.2755  
 Mean   : 1454.71   Mean   : 70.386   Mean   : 1511.98   Mean   : 73.052   Mean   : 1569.26   Mean   : 5.3323  
 3rd Qu.: 1761.16   3rd Qu.:108.493   3rd Qu.: 1830.50   3rd Qu.:112.603   3rd Qu.: 1899.84   3rd Qu.: 8.2192  
 Max.   :19486.61   Max.   :439.646   Max.   :20253.80   Max.   :456.299   Max.   :21020.99   Max.   :33.3065  
                                                                                                               
 Sumpotential1      Potentialroot2    Sumpotential2      Potentialroot3    Sumpotential3      Potentialroot3A  
 Min.   :   0.000   Min.   : 0.0000   Min.   :   0.000   Min.   : 0.0000   Min.   :   0.000   Min.   : 0.0000  
 1st Qu.:   3.469   1st Qu.: 0.5267   1st Qu.:   6.938   1st Qu.: 0.6321   1st Qu.:   8.326   1st Qu.: 0.6584  
 Median :  28.679   Median : 4.5511   Median :  57.358   Median : 5.4613   Median :  68.829   Median : 5.6888  
 Mean   : 114.544   Mean   :10.6645   Mean   : 229.088   Mean   :12.7974   Mean   : 274.906   Mean   :13.3307  
 3rd Qu.: 138.674   3rd Qu.:16.4383   3rd Qu.: 277.348   3rd Qu.:19.7260   3rd Qu.: 332.818   3rd Qu.:20.5479  
 Max.   :1534.379   Max.   :66.6130   Max.   :3068.758   Max.   :79.9356   Max.   :3682.509   Max.   :83.2662  
                                                                                                               
 Sumpotential3A     Potentialroot4    Sumpotential4     Potentialroot5     Sumpotential5     Potentialroot6    Sumpotential6    
 Min.   :   0.000   Min.   : 0.0000   Min.   :   0.00   Min.   :  0.0000   Min.   :   0.00   Min.   :  0.000   Min.   :   0.00  
 1st Qu.:   8.673   1st Qu.: 0.7901   1st Qu.:  10.41   1st Qu.:  0.9218   1st Qu.:  12.14   1st Qu.:  1.053   1st Qu.:  13.88  
 Median :  71.697   Median : 6.8266   Median :  86.04   Median :  7.9643   Median : 100.38   Median :  9.102   Median : 114.72  
 Mean   : 286.360   Mean   :15.9968   Mean   : 343.63   Mean   : 18.6629   Mean   : 400.90   Mean   : 21.329   Mean   : 458.18  
 3rd Qu.: 346.685   3rd Qu.:24.6575   3rd Qu.: 416.02   3rd Qu.: 28.7671   3rd Qu.: 485.36   3rd Qu.: 32.877   3rd Qu.: 554.70  
 Max.   :3835.947   Max.   :99.9195   Max.   :4603.14   Max.   :116.5727   Max.   :5370.33   Max.   :133.226   Max.   :6137.52  
                                                                                                                                
    AccPARi        
 Min.   :   0.000  
 1st Qu.:   6.559  
 Median :  49.712  
 Mean   : 153.338  
 3rd Qu.: 201.712  
 Max.   :1785.400  
                   
fPAR.df
write.csv(fPAR.df,"D:/R/fPARoot1.df.csv", row.names = FALSE)

calculated protential yield and remoblisation

merge PARi and observed data

E3ILLS1<-E3ILL%>%
  filter(Tbb==1)%>%
  filter(Variable=="shootbiomass")%>%
  dplyr::select(Clock.Today,ExpName,Interval, VariableUnits,Observed,StdDEV,ExperimentID,TreatmentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2,GrowthRotation)%>%
  mutate(shootbiomass=Observed,StdDEVS=StdDEV)
  
E3ILLR1<-E3ILL%>%
  filter(Tbb==1)%>%
  filter(Variable=="RootWt")%>%
  dplyr::select(Clock.Today,ExpName,Observed,StdDEV)%>%
  mutate(RootWt=Observed,StdDEVR=StdDEV)
E3ILL1<-merge(E3ILLS1,E3ILLR1,by=c("Clock.Today","ExpName"))%>%
  dplyr::select(-Observed.x,-StdDEV.x,-Observed.y, -StdDEV.y)
  
P.E3ILL<-merge(Tem.factor,E3ILLS1,by=c("Clock.Today","ExpName"))%>%
  unique()
write.csv(P.E3ILL,"D:/R/Respiration/P.E3ILL.csv", row.names = FALSE)

plot potentail and shoot biomass

fPAR.df%>%
  dplyr::filter(ID=="E3ILL")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
 geom_point(data=E3ILLS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
 ##facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
 xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")
Error in FUN(X[[i]], ...) : object 'production.sum2' not found

E3ILSS1<-E3ILS%>%
  #filter(Tbb==1)%>%
  filter(Variable=="shootbiomass")%>%
  dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
  mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E3ILS<-merge(fPAR.df,E3ILSS1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
  dplyr::filter(ID=="E3ILS")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
  geom_point(data=E3ILSS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
  #facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
 xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")
Error in FUN(X[[i]], ...) : object 'production.sum2' not found

E3ISLS1<-E3ISL%>%
  #filter(Tbb==1)%>%
  filter(Variable=="shootbiomass")%>%
  dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
  mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E3ISL<-merge(fPAR.df,E3ISLS1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
  dplyr::filter(ID=="E3ISL")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
  geom_point(data=E3ISLS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
  #facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
 xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

  #remove grid lines 
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E3ISSS1<-E3ISS%>%
  #filter(Tbb==1)%>%
  filter(Variable=="shootbiomass")%>%
  dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
  mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E3ISS<-merge(fPAR.df,E3ISSS1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
  dplyr::filter(ID=="E3ISS")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
  geom_point(data=E3ISSS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
  #facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
 xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

write.csv(P.E3ISS,"D:/R/Respiration/P.E3ISS.csv", row.names = FALSE)
  #remove grid lines 
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E5IHHF5S1<-E5IHHFD5%>%
  #filter(Tbb==1)%>%
  filter(Variable=="shootbiomass")%>%
  dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
  mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E5IHHF5<-merge(fPAR.df,E5IHHF5S1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
  dplyr::filter(ID=="E5IHHF5")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
  geom_point(data=E5IHHF5S1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
  #facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
 xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

  #remove grid lines 
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E5ISSF5S1<-E5ISSFD5%>%
  #filter(Tbb==1)%>%
  filter(Variable=="shootbiomass")%>%
  dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
  mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E5ISSF5S1<-merge(fPAR.df,E5ISSF5S1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
  dplyr::filter(ID=="E5ISSF5")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
  geom_point(data=E5ISSF5S1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
  #facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
 xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

  #remove grid lines 
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E5ILLF5S1<-E5ILLF5%>%
  #filter(Tbb==1)%>%
  filter(Variable=="shootbiomass")%>%
  dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
  mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E5ILLF5S1<-merge(fPAR.df,E5ILLF5S1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
  dplyr::filter(ID=="E5ILLF5")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
  geom_point(data=E5ILLF5S1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
  #facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
 xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

Load data

analysis of production

upDir <- "D:/R/Respiration/"
obsData <- "D:/R/Respiration/"
Biomass <- read.csv(paste0(obsData, "fPARoot.df.CSV"),
                   header = TRUE) %>%
  mutate(Clock.Today=dmy(Clock.Today))
Biomass.LL<-Biomass%>%                                ####Root biomass just from respiration 0.03
  filter(ID=="E3ILL")%>%
  filter(RootRespiration1!="NA")
Biomass.LL%>%
  ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ILL"))+
 xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")

Root growth Rate calculation

plot potential root biomass aganist accumlated Tt (linear regression analysis)

calculate root growth rate

Biomass1<-Biomass%>%
  mutate(PT=Tt_fick_sum/Pp)%>%
  mutate(per=Partitioning/production.sum)%>%
  filter(ExperimentID=="E3")%>%
  filter(Partitioning!="NA")
Biomass1%>%
  #filter(ID=="E3ILL")%>%
  ggplot(aes(x=Tt_broken_sum, y=Partitioning,color=ID))+geom_point(size=1)+
  facet_grid(GrowthSeason~Rotation) + theme_bw()+mytheme3+xlab("Thermal time")+ylab("Potential root storage")

   #geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") 
  #geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))
ggsave("D:/R/Pictures/C5/Yield/rootstorage.png", width=8, height=6, dpi=500)

Increasing Pp

RUE testing

BiomassShootE31<-BiomassInc%>%
  filter(Variable=="Production.sum9")
BiomassShootE31%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
 mytheme3

BiomassInc %>%
  mutate(Observed=shootbiomass)%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.72, 0.77, 0.82, 0.87, 0.92, 0.97, 1.02, 1.07, 1.12, (1.17), 1.22, 1.27, 1.32,1.37, 1.42, 1.52, 1.62, 1.72

Dec Pp

BiomassDec <- Biomass %>% 
  filter(ExperimentID=="E3")%>%
  filter(shootbiomass!="NA")%>%
  filter(Trend=="Dec")%>%
  filter(fPAR!=0)%>%
  dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7,Production.sum7A,Production.sum7B,Production.sum7C,Production.sum7D,Production.sum8,Production.sum8A,Production.sum8B,Production.sum8C,Production.sum8D,Production.sum9,Production.sum9A,Production.sum9B,Production.sum9C,Production.sum9D,Production.sum10,Production.sum11,Production.sum12,Production.sum13) %>%
  tidyr::gather("Variable","Predicted",Production.sum3:Production.sum10)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassDec $Variable<-factor(BiomassDec$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassDec%>%
  ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Shoot biomass (Dec)")+
  facet_wrap(~Variable, ncol = 6)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed") +theme(legend.title=element_blank(),legend.position = "blank")
 ggsave("D:/R/Pictures/C5/Yield/RUEshootDec.png", width=8, height=8, dpi=500)

  
BiomassShootE32<-BiomassDec%>%
  filter(Variable=="Production.sum4A")
BiomassShootE32%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
 mytheme3

Combine increasinf and decreasing shoot biomass

BiomassShootE3<-rbind(BiomassShootE31,BiomassShootE32)
BiomassShootE3%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
 mytheme3
ggsave("D:/R/Pictures/C5/Yield/Shootbiomass.png", width=8, height=8, dpi=500)

stistical measurement


BiomassDec %>%
  mutate(Observed=shootbiomass)%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.72, 0.77, 0.82, 0.87, 0.92,(0.93), 0.97, 1.02, 1.07, 1.12, 1.17, 1.22, 1.27, 1.32,1.37, 1.42, 1.52, 1.62, 1.72

RUE testing for seedling crop

BiomassInc1 <- Biomass %>% 
  filter(ExperimentID=="E5")%>%
  filter(shootbiomass!="NA")%>%
  filter(Trend=="Inc")%>%
  filter(fPAR!=0)%>%
  filter(Stage!="Seedling")%>%
  dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7,Production.sum7A,Production.sum7B,Production.sum7C,Production.sum7D,Production.sum8,Production.sum8A,Production.sum8B,Production.sum8C,Production.sum8D,Production.sum9,Production.sum9A,Production.sum9B,Production.sum9C,Production.sum9D,Production.sum10,Production.sum11,Production.sum12,Production.sum13) %>%
  tidyr::gather("Variable","Predicted",Production.sum3:Production.sum10)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassInc1 $Variable<-factor(BiomassInc1$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassInc1%>%
  ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Shoot biomass (Inc)")+
  facet_wrap(~Variable, ncol = 6)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed") +
  theme(legend.title=element_blank(),legend.position = "blank")
 ggsave("D:/R/Pictures/C5/Yield/RUEshootIncE5.png", width=8, height=8, dpi=500)

shoot inc

BiomassShootE51<-BiomassInc1%>%
  filter(Variable=="Production.sum9")
BiomassShootE51%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
 mytheme3

BiomassInc1 %>%
  mutate(Observed=shootbiomass)%>%
   #filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.72, 0.77, 0.82, 0.87, 0.92, 0.97, 1.02, 1.07, 1.12, 1.17, 1.22, 1.27, 1.32,1.37, 1.42, 1.52, 1.62, 1.72

RUE testing for regrowth crop

BiomassDec1 <- Biomass %>% 
  filter(ExperimentID=="E5")%>%
  filter(shootbiomass!="NA")%>%
  filter(Trend=="Dec")%>%
  filter(fPAR!=0)%>%
  filter(Stage!="Seedling")%>%
  dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7,Production.sum7A,Production.sum7B,Production.sum7C,Production.sum7D,Production.sum8,Production.sum8A,Production.sum8B,Production.sum8C,Production.sum8D,Production.sum9,Production.sum9A,Production.sum9B,Production.sum9C,Production.sum9D,Production.sum10,Production.sum11,Production.sum12,Production.sum13) %>%
  tidyr::gather("Variable","Predicted",Production.sum3:Production.sum10)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassDec1 $Variable<-factor(BiomassDec1$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassDec1%>%
  ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Shoot biomass (Dec)")+
  facet_wrap(~Variable, ncol = 6)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed")+ 
  theme(legend.title=element_blank(),legend.position = "blank")
 ggsave("D:/R/Pictures/C5/Yield/RUEshootDecE5.png", width=8, height=8, dpi=500)

shoot Dec

BiomassShootE52<-BiomassDec1%>%
  filter(Variable=="Production.sum4A")
BiomassShootE52%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
 mytheme3

Combine increasinf and decreasing shoot biomass

BiomassShootE5<-rbind(BiomassShootE51,BiomassShootE52)
BiomassShootE5%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
  facet_wrap(~ID,ncol = 1)+
  geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
  theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
 mytheme3
ggsave("D:/R/Pictures/C5/Yield/ShootbiomassE5.png", width=8, height=8, dpi=500)

BiomassDec1 %>%
  mutate(Observed=shootbiomass)%>%
   #filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72

RUE testing for seedling crop

BiomassSeedling <- Biomass %>% 
  filter(ExperimentID=="E5")%>%
  filter(shootbiomass!="NA")%>%
  #filter(Trend=="Dec")%>%
  filter(fPAR!=0)%>%
  filter(Stage=="Seedling")%>%
  dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7) %>%
  tidyr::gather("Variable","Predicted",Production.sum0:Production.sum7)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassSeedling $Variable<-factor(BiomassSeedling$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassSeedling%>%
  ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Shoot biomass (Seedling)")+
  facet_wrap(~Variable, ncol = 6)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed") +
  theme(legend.title=element_blank(),legend.position = "blank")
 ggsave("D:/R/Pictures/C5/Yield/RUESeedling.png", width=8, height=8, dpi=500)

BiomassSeedling %>%
  mutate(Observed=shootbiomass)%>%
   #filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72

Root predicted for E3

BiomassRoot <- Biomass %>% 
  filter(ExperimentID=="E3")%>%
  filter(RootWt!="NA")%>%
  #filter(Stage!="Seedling")%>%
  dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend, Stage,GrowthRotation,RootWt,StS,TotalBiomass,Proot.0.045., Proot1.0.03.,Proot2.0.01.,Proot3.0.005.,Proot4.0.003.,Proot5.0.002.,Proot6.0.0005.,Proot7.0.0005.,Proot8.0.2.,Proot9.0.25.) %>%
  tidyr::gather("Variable","Predicted",Proot.0.045.:Proot9.0.25.)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassRoot $Variable<-factor(BiomassRoot$Variable, levels=c("Proot.0.045.", "Proot1.0.03.","Proot2.0.01.","Proot3.0.005.","Proot4.0.003.","Proot5.0.002.","Proot6.0.0005.","Proot7.0.0005.","Proot8.0.2.","Proot9.0.25."))
BiomassRoot%>%
  ggplot(aes(x=RootWt, y= Predicted, colour= factor(ID))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Root biomass (E3)")+
  facet_wrap(~Variable, ncol = 4)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed") +
  theme(legend.title=element_blank(),legend.position = "blank")
 ggsave("D:/R/Pictures/C5/Yield/RootWtE3.png", width=8, height=8, dpi=500)

BiomassRoot %>%
  mutate(Observed=RootWt)%>%
   #filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72
BiomassRoot%>%
  filter(ExperimentID=="E3")%>%
  filter(RootWt!="NA")%>%
  filter(Variable=="Proot9.0.25.")%>%
  ggplot(aes(x=Clock.Today,y=Predicted))+geom_line(size=1)+theme_bw()+
 facet_wrap(~ID,ncol = 2)+
 geom_point(aes(x=Clock.Today, y=RootWt),colour="green",size=3)+mytheme3+
 theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Root DM ('*kg~ha^-1*')')))
  ggsave("D:/R/Pictures/C5/Yield/RootWtpredictedE3.png", width=8, height=6, dpi=500)

Root predicted for E5

BiomassRoot1 <- Biomass %>% 
  filter(ExperimentID=="E5")%>%
  filter(RootWt!="NA")%>%
  #filter(Stage!="Seedling")%>%
  dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend, Stage,GrowthRotation,RootWt,StS,TotalBiomass,Proot.0.045., Proot1.0.03.,Proot2.0.01.,Proot3.0.005.,Proot4.0.003.,Proot5.0.002.,Proot6.0.0005.,Proot7.0.0005.,Proot8.0.2.,Proot9.0.25.) %>%
  tidyr::gather("Variable","Predicted",Proot.0.045.:Proot9.0.25.)
  #filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
  #filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassRoot $Variable<-factor(BiomassRoot$Variable, levels=c("Proot.0.045.", "Proot1.0.03.","Proot2.0.01.","Proot3.0.005.","Proot4.0.003.","Proot5.0.002.","Proot6.0.0005.","Proot7.0.0005.","Proot8.0.2.","Proot9.0.25."))
BiomassRoot1%>%
  ggplot(aes(x=RootWt, y= Predicted, colour= factor(ID))) +
  geom_point(size=2)+theme_bw()+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
  geom_abline(intercept = 0, slope = 1) +
  coord_fixed(ratio = 1)+
  ggtitle("Root biomass (E5)")+
  facet_wrap(~Variable, ncol = 4)+
  theme_bw()+mytheme3+
   scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
  scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
  ylab("Predicted")+xlab("Observed") +
  theme(legend.title=element_blank(),legend.position = "blank")
 ggsave("D:/R/Pictures/C5/Yield/RootWtE5.png", width=8, height=6, dpi=500)

BiomassRoot1 %>%
  mutate(Observed=RootWt)%>%
   #filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
  group_by(Variable) %>%
  summarise(
    n = n(),
    r2 = gauchStats(Predicted,Observed)[5],
  #  rmse = round(rmse(Predicted,Observed),0),
    r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
    nse = round(NSE(Predicted,Observed),1),
    sb = gauchStats(Predicted,Observed)[1],
  nu = gauchStats(Predicted,Observed)[2],
  lc = gauchStats(Predicted,Observed)[3]
  ) 
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72
BiomassRoot1%>%
  filter(ExperimentID=="E5")%>%
  filter(RootWt!="NA")%>%
  filter(Variable=="Proot9.0.25.")%>%
  ggplot(aes(x=Clock.Today,y=Predicted))+geom_line(size=1)+theme_bw()+
 facet_wrap(~ID,ncol = 2)+
 geom_point(aes(x=Clock.Today, y=RootWt),colour="green",size=3)+mytheme3+
 theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Root DM ('*kg~ha^-1*')')))
  ggsave("D:/R/Pictures/C5/Yield/RootWtpredictedE5.png", width=8, height=6, dpi=500)

average of partitioning rate

average of cutting treatment

Biomass2<-Biomass%>%
  filter(Partitioning!="NA")%>%
  group_by(GrowthSeason,Rotation,GrowthRotation,Tmean,Ppm,Stage,Trend,ID,ExperimentID) %>%
  do(mod1 = lm(Storage2~Tt_broken_sum,data=.)) %>%
  mutate(PRate1 = summary(mod1)$coeff[2]) %>%
  dplyr::select(-mod1)
Error in eval(predvars, data, env) : object 'Storage2' not found

Root growth rate for dividual experiment


Biomass3<-Biomass%>%
filter(ID=="E5ILLF5")%>%
  filter(Partitioning!="NA")%>%
  mutate(Part.Rate=Partitioning/Tt_broken_sum)%>%
   filter(Part.Rate>0)%>%
  ggplot(aes(x=Tt_broken_sum, y=Part.Rate,color=ID))+geom_point(size=1)+
  facet_grid(GrowthSeason~Rotation) + theme_bw()+mytheme3+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") 
  #geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2)
interceptulate partioning rate

good effort but No!!!!!!

###fPAR interpolate for each rotation

# UniExp <- unique(Biomass.LL$ExpName)
# 
# Biomass.LL.df <- data.frame()
#   
# for(i in 1:length(UniExp))
# {
#   
#  Biomass.LL.ex<-Biomass.LL %>%
#   mutate(PPR=approx(Clock.Today,PartitioningRate2, xout =Clock.Today, 
#          method="linear", 
#          rule = 2)$y)    ##interpolate function
# Biomass.LL.df<- rbind( Biomass.LL.ex, Biomass.LL.df)
# 
# }
# 
# Biomass.LL.df 
# write.csv(Biomass.LL.df ,"D:/R/Respiration/Biomass.LL.df .csv", row.names = FALSE)

Calculated RUE

RUET<-Biomass%>%
  filter(RootWt!="NA")%>%
  filter(TotalBiomass!="NA")

RUEE3<-RUET%>%
  filter(ExperimentID=="E5")%>%
  mutate(RootWt=RootWt/0.8)%>%
  mutate(TotalBiomass=RootWt+shootbiomass)%>%
  mutate(TotalBiomass1=TotalBiomass*0.1)

RUE5<-RUET%>%
  filter(ExperimentID=="E3")%>%
  mutate(TotalBiomass1=TotalBiomass*0.1)

RUE<-rbind(RUEE3,RUE5)
 

RUE%>%
  filter(ID=="E3ILL")%>%
  ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
    xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
    ggtitle("E3ILL")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
 scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
  filter(ID=="E3ILS")%>%
  ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
    xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
    ggtitle("E3ILS")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
 scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
  filter(ID=="E3ISL")%>%
  ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
    xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
    ggtitle("E3ISL")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
 scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
  filter(ID=="E3ISS")%>%
  ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
    xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
    ggtitle("E3ISS")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 800, by =300), limits=c(0,800))+
 scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
  filter(ID=="E5IHHF5")%>%
  ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
    xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
    ggtitle("E5IHHF5")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
 scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
  filter(ID=="E5ILLF5")%>%
  ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
    xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
    ggtitle("E5ILLF5")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
 scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
  filter(ID=="E5ISSF5")%>%
  ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
    xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
    ggtitle("E5ISSF5")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
 scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))

RUE

RUETotal<-RUE%>%
group_by(ExpName,GrowthSeason,Rotation,GrowthRotation,Tmean,Ppm,Stage,Trend,ID,ExperimentID,Defoliation) %>%
  do(mod = lm(TotalBiomass1~AccPARi,data=.)) %>%
  mutate(RUEt = summary(mod)$coeff[2]) %>%
  dplyr::select(-mod)
  
RUETotal$Trend<- factor(RUETotal$Trend, levels=c("Inc","Dec"))

RUETotal1<-RUETotal%>%
  dplyr::filter(RUEt>0)%>%
  dplyr::filter(RUEt<2)%>%
  filter(Defoliation=="LL")%>%
   dplyr::filter(ExpName!="Iversen_91DefoliationLLGs_2Rt_6")%>%
  dplyr::filter(ExpName!="Iversen_91DefoliationLLGs_2Rt_7")%>%
  dplyr::filter(ExpName!="Iversen_121DefoliationLLFDFD5Gs_4Rt_2")
  

library(plyr)

lm_eqn2 <- function(RUETotal1){
  m <- lm(RUEt~Tmean ,RUETotal1);
  eq <- substitute(italic(y) == Tmean +RUEt %.% italic(RUEt)*","~~italic(R)^2~"="~r2, 
                   list(Tmean = format(coef(m)[1], digits = 2), 
                        RUEt= format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}


eqsRUE <- ddply(RUETotal1,.(Stage,Trend),lm_eqn2)

RUETotal1%>%
  filter(Defoliation=="LL")%>%
  ggplot(aes(x=Tmean,y=RUEt,colour=ID,label=GrowthRotation))+geom_text()+theme_bw()+
    xlab('Mean temperature (°C)')+ylab(bquote(bold('RUE ('*g~MJ^-1*')')))+
    ggtitle("E5ISSF5")  +
 geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
 #facet_grid(Stage~Trend)+
  facet_grid(Trend~Stage)+
  mytheme3+
scale_x_continuous(breaks = seq(10, 18, by =3), limits=c(10,18))+
  scale_y_continuous(breaks = seq(0, 2, by =1), limits=c(0,2))+
geom_text(data = eqsRUE, aes(x =13.5, y = 2, label = V1), 
          color = 'black',  parse = TRUE, size=4)


 ggsave("D:/R/Pictures/C5/Yield/RUE.png", width=8, height=4, dpi=500)

detach(package:plyr)

predicted Vs observed for partitiong

Biomass.LL%>%
  ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
  ylab("Root biomass (kg/ha)")

ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ILL.png", width=8, height=4, dpi=500)

Root partitioning rate analysis

Biomass$Trend<-factor(Biomass$Trend, levels=c("Inc", "Dec"))


Biomass%>%  
  filter(RootRespiration1!="NA")%>%
  filter(PartitioningRer1>0)%>%
   filter(ExperimentID=="E3")%>%
  mutate(Rotation=as.factor(Rotation),GrowthSeason=as.factor(GrowthSeason))%>%        ####Root biomass just from respiration 0.03
  ggplot(aes(x=Pp, y=PartitioningRer1))+geom_point(size=1)+theme_bw()+mytheme3+
  facet_grid(ID~Trend)+xlab("Photoperiod (h)")+
  ylab("Proot")+
  #scale_x_continuous(breaks = seq(10, 17, by =2), limits=c(10,17))+
  #scale_y_continuous(breaks = seq(0, 0.5, by =0.5), limits=c(0,0.5))+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")

ggsave("D:/R/Pictures/C5/Yield/E3.Proot.png", width=8, height=6, dpi=500)

Root partitioning rate analysis

Biomass$Trend<-factor(Biomass$Trend, levels=c("Inc", "Dec"))


Biomass%>%  
  filter(RootRespiration1!="NA")%>%
  filter(PartitioningRer1>0)%>%
   filter(ExperimentID=="E5")%>%
  mutate(Rotation=as.factor(Rotation),GrowthSeason=as.factor(GrowthSeason))%>%        ####Root biomass just from respiration 0.03
  ggplot(aes(x=Pp, y=PartitioningRer1))+geom_point(size=1)+theme_bw()+mytheme3+
  facet_grid(ID~Trend)+xlab("Photoperiod (h)")+
  ylab("Proot")+
  #scale_x_continuous(breaks = seq(10, 17, by =2), limits=c(10,17))+
  #scale_y_continuous(breaks = seq(0, 0.5, by =0.5), limits=c(0,0.5))+
  geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")

ggsave("D:/R/Pictures/C5/Yield/E5.Proot.png", width=8, height=6, dpi=500)

LS Root analysis

Biomass.LS<-Biomass%>%
  filter(ID=="E3ILS")%>%
  filter(RootRespiration1!="NA")
Biomass.LS%>%
  ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ILS"))+
 xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")

predicted Vs observed for partitiong

Biomass.LS%>%
  ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+xlab("Date")+
  ylab("Root biomass (kg/ha)")

ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ILS.png", width=8, height=4, dpi=500)

SL root analysis

Biomass.SL<-Biomass%>%
  filter(ID=="E3ISL")%>%
  filter(RootRespiration1!="NA")
Biomass.SL%>%
  ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ISL"))+
 xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")

predicted vs observed in SL

Biomass.SL%>%
  ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
  ylab("Root biomass (kg/ha)")

ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ISL.png", width=8, height=4, dpi=500)

SS root analysis

Biomass.SS<-Biomass%>%
  filter(ID=="E3ISS")%>%
  filter(RootRespiration1!="NA")
Biomass.SS%>%
  ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ISS"))+
 xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")

predicted vs obsserved

Biomass.SS%>%
  ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
  ylab("Root biomass (kg/ha)")

ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ISS.png", width=8, height=4, dpi=500)

E5LLF5

Biomass.LLF5<-Biomass%>%
  filter(ID=="E5ILLF5")%>%
  filter(RootRespiration1!="NA")
Biomass.LLF5%>%
  ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt,size=2,color="blue"))

predicted vs obsserved

Biomass.LLF5%>%
  ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
  ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE5ILLF5.png", width=8, height=4, dpi=500)

E5HHF5

Biomass.HHF5<-Biomass%>%
  filter(ID=="E5IHHF5")%>%
  filter(RootRespiration1!="NA")
Biomass.HHF5%>%
  ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt,size=2))+ggtitle(paste0("E5IHHF5"))+
 xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")

predicted Vs observed

Biomass.HHF5%>%
  ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
  ylab("Root biomass (kg/ha)")

ggsave("D:/R/Pictures/C5/Yield/RootGrowthE5IHHF5.png", width=8, height=4, dpi=500)

E5SSF5

Biomass.SSF5<-Biomass%>%
  filter(ID=="E5ISSF5")%>%
  filter(RootRespiration1!="NA")
Biomass.SSF5%>%
  ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt,size=2,color="blue"))

predicted Vs observed

Biomass.SSF5%>%
  ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
  geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
  ylab("Root biomass (kg/ha)")

ggsave("D:/R/Pictures/C5/Yield/RootGrowthE5ISSF5.png", width=8, height=4, dpi=500)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICANCmxpYnJhcnkoaHlkcm9HT0YpDQpsaWJyYXJ5KHh0YWJsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShSU1FMaXRlKQ0KbGlicmFyeShhZ3JpY29sYWUpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoem9vKQ0KbGlicmFyeShwb2x5bm9tKQ0KDQpgYGANCiMjIGxvZGUgb2JzZXJ2ZWQgZGF0YQ0KYGBge3J9DQp1cERpciA8LSAiRDovUi9Db21iaW5lZERhdGEvIg0Kb2JzRGF0YSA8LSAiRDovUi9Db21iaW5lZERhdGEvIg0KDQpvYnNBbGwgPC0gcmVhZC50YWJsZShwYXN0ZTAob2JzRGF0YSwgIk9ic0FsbDEudHh0IiksDQogICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNCm9ic0E0PC0gb2JzQWxsICU+JQ0KICBkcGx5cjo6ZmlsdGVyKENvbGxlY3Rpb249PSIyMDE0XzIwMTgiKSU+JQ0KICBtdXRhdGUoU3RhcnREYXRlPWRteShTdGFydERhdGUpLE1pZERhdGU9ZG15KE1pZERhdGUpLEZpbmlzaERhdGU9ZG15KEZpbmlzaERhdGUpLENsb2NrLlRvZGF5PWRteShDbG9jay5Ub2RheSkpICU+JQ0KICAjbXV0YXRlKFNvd2luZ0RhdGU9YXMuZmFjdG9yKGlmZWxzZShTb3dpbmdEYXRlPT0ibm8iLCJTZF9ObyIscGFzdGUwKCJTZF8iLFNvd2luZ0RhdGUpKSkpICU+JSAjIGFzc3VtZSB0aGlzIGlzIHR5cG8gdG8gYmUgZml4ZWQ/DQogIG11dGF0ZShHcm93dGhTZWFzb24xPWFzLmZhY3RvcihwYXN0ZTAoIkdzXyIsR3Jvd3RoU2Vhc29uKSkpICU+JSAjIGNyZWF0aW5nIG1vcmUgaW50dWl0aXZlIGxhYmVscyBoZXJlDQogIG11dGF0ZShSb3RhdGlvbjE9YXMuZmFjdG9yKHBhc3RlMCgiUnRfIixSb3RhdGlvbikpKSAlPiUNCiAgbXV0YXRlKEV4cFVuaXRDb2RlPWFzLmZhY3RvcihwYXN0ZTAoTmFtZSxHcm93dGhTZWFzb24xLFJvdGF0aW9uMSkpKSAlPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKSU+JQ0KICBtdXRhdGUoR3Jvd3RoU2Vhc29uMj1hcy5mYWN0b3IocGFzdGUwKCJZIixHcm93dGhTZWFzb24sIigiLFBlcmlvZCwiKSIpKSkgJT4lDQogIG11dGF0ZShSb3RhdGlvbjI9YXMuZmFjdG9yKGlmZWxzZShSb3RhdGlvbj09IjEiLHBhc3RlMCgiUyIsUm90YXRpb24pLHBhc3RlMCgiUiIsUm90YXRpb24pKSkpDQogDQoNCm9ic0EzPC0gb2JzQWxsICU+JQ0KICBkcGx5cjo6ZmlsdGVyKENvbGxlY3Rpb249PSIyMDAyXzIwMDQiKSU+JQ0KICBtdXRhdGUoU3RhcnREYXRlPWRteShTdGFydERhdGUpLE1pZERhdGU9ZG15KE1pZERhdGUpLEZpbmlzaERhdGU9ZG15KEZpbmlzaERhdGUpLENsb2NrLlRvZGF5PWRteShDbG9jay5Ub2RheSkpICU+JQ0KICAjbXV0YXRlKFNvd2luZ0RhdGU9YXMuZmFjdG9yKGlmZWxzZShTb3dpbmdEYXRlPT0ibm8iLCJTZF9ObyIscGFzdGUwKCJTZF8iLFNvd2luZ0RhdGUpKSkpICU+JSAjIGFzc3VtZSB0aGlzIGlzIHR5cG8gdG8gYmUgZml4ZWQ/DQogIG11dGF0ZShHcm93dGhTZWFzb24xPWFzLmZhY3RvcihwYXN0ZTAoIkdzXyIsR3Jvd3RoU2Vhc29uKSkpICU+JSAjIGNyZWF0aW5nIG1vcmUgaW50dWl0aXZlIGxhYmVscyBoZXJlDQogIG11dGF0ZShSb3RhdGlvbjE9YXMuZmFjdG9yKHBhc3RlMCgiUnRfIixSb3RhdGlvbikpKSAlPiUNCiAgbXV0YXRlKEV4cFVuaXRDb2RlPWFzLmZhY3RvcihwYXN0ZTAoTmFtZSxHcm93dGhTZWFzb24xLFJvdGF0aW9uMSkpKSAlPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKSU+JQ0KICBtdXRhdGUoR3Jvd3RoU2Vhc29uMj1hcy5mYWN0b3IocGFzdGUwKCJZIixHcm93dGhTZWFzb24sIigiLFBlcmlvZCwiKSIpKSkgJT4lDQogIG11dGF0ZShSb3RhdGlvbjI9YXMuZmFjdG9yKHBhc3RlMCgiUiIsUm90YXRpb24pKSkNCiAgDQpvYnNBUjwtcmJpbmQob2JzQTMsb2JzQTQpDQpzdW1tYXJ5KG9ic0FSKQ0KIG9ic0FSDQoNCg0KYGBgDQpgYGB7cn0NCnVwRGlyIDwtICJEOi9SL0NvbWJpbmVkRGF0YS8iDQpvYnNEYXRhIDwtICJEOi9SL0NvbWJpbmVkRGF0YS8iDQoNCm9ic1NSRiA8LSByZWFkLnRhYmxlKHBhc3RlMChvYnNEYXRhLCAiRGVmb2xpYXRpb24udHh0IiksDQogICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNCm9ic0RTPC0gb2JzU1JGICU+JQ0KICAjZHBseXI6OmZpbHRlcihGRD09IkZENSIpJT4lDQogIG11dGF0ZShTdGFydERhdGU9ZG15KFN0YXJ0RGF0ZSksTWlkRGF0ZT1kbXkoTWlkRGF0ZSksRmluaXNoRGF0ZT1kbXkoRmluaXNoRGF0ZSksQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgbXV0YXRlKEdyb3d0aFNlYXNvbjE9YXMuZmFjdG9yKHBhc3RlMCgiR3NfIixHcm93dGhTZWFzb24pKSkgJT4lICMgY3JlYXRpbmcgbW9yZSBpbnR1aXRpdmUgbGFiZWxzIGhlcmUNCiAgbXV0YXRlKFJvdGF0aW9uMT1hcy5mYWN0b3IocGFzdGUwKCJSdF8iLFJvdGF0aW9uKSkpICU+JQ0KICBtdXRhdGUoRXhwVW5pdENvZGU9YXMuZmFjdG9yKHBhc3RlMChOYW1lLEdyb3d0aFNlYXNvbjEsUm90YXRpb24xKSkpICU+JQ0KICBtdXRhdGUoQ2xvY2suVG9kYXkxID0gYXMuUE9TSVhjdChwYXN0ZShDbG9jay5Ub2RheSxUaW1lKSxmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIikpJT4lDQogIG11dGF0ZShHcm93dGhTZWFzb24yPWFzLmZhY3RvcihwYXN0ZTAoIlkiLEdyb3d0aFNlYXNvbiwiKCIsUGVyaW9kLCIpIikpKSAlPiUNCiBtdXRhdGUoUm90YXRpb24yPWFzLmZhY3RvcihwYXN0ZTAoIlIiLFJvdGF0aW9uKSkpJT4lDQogICBkcGx5cjo6ZmlsdGVyKFZhcmlhYmxlPT1jKCJzaG9vdGJpb21hc3MiKSkNCiBvYnNEUw0KIG9ic0RSPC0gb2JzU1JGICU+JQ0KICAjZHBseXI6OmZpbHRlcihGRD09IkZENSIpJT4lDQogIG11dGF0ZShTdGFydERhdGU9ZG15KFN0YXJ0RGF0ZSksTWlkRGF0ZT1kbXkoTWlkRGF0ZSksRmluaXNoRGF0ZT1kbXkoRmluaXNoRGF0ZSksQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgbXV0YXRlKEdyb3d0aFNlYXNvbjE9YXMuZmFjdG9yKHBhc3RlMCgiR3NfIixHcm93dGhTZWFzb24pKSkgJT4lICMgY3JlYXRpbmcgbW9yZSBpbnR1aXRpdmUgbGFiZWxzIGhlcmUNCiAgbXV0YXRlKFJvdGF0aW9uMT1hcy5mYWN0b3IocGFzdGUwKCJSdF8iLFJvdGF0aW9uKSkpICU+JQ0KICBtdXRhdGUoRXhwVW5pdENvZGU9YXMuZmFjdG9yKHBhc3RlMChOYW1lLEdyb3d0aFNlYXNvbjEsUm90YXRpb24xKSkpICU+JQ0KICBtdXRhdGUoQ2xvY2suVG9kYXkxID0gYXMuUE9TSVhjdChwYXN0ZShDbG9jay5Ub2RheSxUaW1lKSxmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIikpJT4lDQogIG11dGF0ZShHcm93dGhTZWFzb24yPWFzLmZhY3RvcihwYXN0ZTAoIlkiLEdyb3d0aFNlYXNvbiwiKCIsUGVyaW9kLCIpIikpKSAlPiUNCiBtdXRhdGUoUm90YXRpb24yPWFzLmZhY3RvcihwYXN0ZTAoIlIiLFJvdGF0aW9uKSkpJT4lDQogICBkcGx5cjo6ZmlsdGVyKFZhcmlhYmxlPT1jKCJSb290V3QiKSkNCiBvYnNEU1I8LXJiaW5kKG9ic0RTLG9ic0RSKQ0KIA0KIHdyaXRlLmNzdiggb2JzRFNSLCJEOi9SL0NvbWJpbmVkRGF0YS9vYnNEU1IuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpIA0KYGBgDQojIyBvYnMgVnMgUHJlIGZvciBlYWNoIGV4cGVyaW1lbnQNCmBgYHtyfQ0KdXBEaXIgPC0gIkQ6L1IvIg0Kb2JzRGF0YSA8LSAiRDovUi9UdEFsbC8iDQoNClR0PC0gcmVhZC50YWJsZShwYXN0ZTAob2JzRGF0YSwgImRmLmFsbC50eHQiKSwNCiAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpDQpUdEEgPC0gVHQgJT4lIG11dGF0ZShDbG9jay5Ub2RheT1kbXkoQ2xvY2suVG9kYXkpLCBFeHBVbml0Q29kZT1hcy5mYWN0b3IoRXhwTmFtZSkpDQpUdEENCk9ic0RSU1IxIDwtbWVyZ2Uob2JzRFNSLFR0QSxieT1jKCJDbG9jay5Ub2RheSIsIkV4cFVuaXRDb2RlIikpICU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249YXMuZmFjdG9yKHBhc3RlMChHcm93dGhTZWFzb24ueCxSb3RhdGlvbi54KSkpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJSb290V3QiKQ0KICANCk9ic0RSU1MxIDwtbWVyZ2Uob2JzRFNSLFR0QSxieT1jKCJDbG9jay5Ub2RheSIsIkV4cFVuaXRDb2RlIikpICU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249YXMuZmFjdG9yKHBhc3RlMChHcm93dGhTZWFzb24ueCxSb3RhdGlvbi54KSkpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKQ0KT2JzRFJTMTwtcmJpbmQoT2JzRFJTUjEsT2JzRFJTUzEpDQpzdW1tYXJ5KE9ic0RSUzEpDQpgYGANCiMjI0NvbWJpbmUgb2JzZXJ2ZWQgZGF0YSB3aXRoIFR0DQpgYGB7cn0NCnVwRGlyIDwtICJEOi9SLyINCm9ic0RhdGEgPC0gIkQ6L1IvVHRBbGwvIg0KDQpUdDwtIHJlYWQudGFibGUocGFzdGUwKG9ic0RhdGEsICJkZi5hbGwudHh0IiksDQogICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKQ0KVHRBIDwtIFR0ICU+JSBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSwgRXhwVW5pdENvZGU9YXMuZmFjdG9yKEV4cE5hbWUpKQ0KVHRBDQpPYnNSU1IxIDwtbWVyZ2Uob2JzQVIsVHRBLGJ5PWMoIkNsb2NrLlRvZGF5IiwiRXhwVW5pdENvZGUiKSkgJT4lDQogIG11dGF0ZShHcm93dGhSb3RhdGlvbj1hcy5mYWN0b3IocGFzdGUwKEdyb3d0aFNlYXNvbi54LFJvdGF0aW9uLngpKSklPiUNCiAgZHBseXI6OmZpbHRlcihUYmI9PTEpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRGVmb2xpYXRpb24ueD09IkxMIiklPiUNCiAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KICAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKQ0KDQpPYnNSU1MxIDwtbWVyZ2Uob2JzQVIsVHRBLGJ5PWMoIkNsb2NrLlRvZGF5IiwiRXhwVW5pdENvZGUiKSkgJT4lDQogIG11dGF0ZShHcm93dGhSb3RhdGlvbj1hcy5mYWN0b3IocGFzdGUwKEdyb3d0aFNlYXNvbi54LFJvdGF0aW9uLngpKSklPiUNCiAgZHBseXI6OmZpbHRlcihUYmI9PTEpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRGVmb2xpYXRpb24ueD09IkxMIiklPiUNCiAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KICAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKQ0KT2JzUlMxPC1yYmluZChPYnNSU1IxLE9ic1JTUzEpICANCnN1bW1hcnkoT2JzUlMxKQ0KYGBgDQpgYGB7cn0NCm15dGhlbWUxPC10aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCxhbmdsZT05MCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQoNCm15dGhlbWUzPC10aGVtZSgNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplID0gMTQsZmFjZT0icGxhaW4iKSwNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIikNCmBgYA0KDQoNCiMjUGxvdCBkYXRhDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpPYnNSUzEkVmFyaWFibGU8LSBmYWN0b3IoT2JzUlMxJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFM0lMTDwtT2JzUlMxJT4lDQogIGZpbHRlcihJRD09IkUzSUxMIikNCiMgc2ltRDE8LXNpbUQlPiUNCiMgICAgbXV0YXRlKENsb2NrLlRvZGF5ID0geW1kX2htcyhDbG9jay5Ub2RheSkpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJSb290V3QifFZhcmlhYmxlPT0ic2hvb3RiaW9tYXNzIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihDbG9jay5Ub2RheT4iMjAwMi0wNi0wMSIpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoTmFtZT09Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikNCiMgICBzaW1EMSRWYXJpYWJsZTwtIGZhY3Rvciggc2ltRDEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkgIA0KIyBSb290Lkw8LVJvb3QuZGZBJT4lDQojICAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpKQ0KIyAgIA0KICANCkUzSUxMJT4lDQogIGRwbHlyOjpmaWx0ZXIoR3Jvd3RoU2Vhc29uLng9PSIxIiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTNJTEwiLCIoSXZlcnNlbl85MURlZm9saWF0aW9uTEwpIikpKw0KICAjZ2VvbV9wb2ludChkYXRhPVJvb3QuTCxhZXMoeD1DbG9jay5Ub2RheTEseT1Sb290V3Qsc2l6ZT0yKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FM0lMTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkUzSUxMPC1PYnNSUzElPiUNCiAgZmlsdGVyKElEPT0iRTNJTEwiKQ0KIyBzaW1EMTwtc2ltRCU+JQ0KIyAgICBtdXRhdGUoQ2xvY2suVG9kYXkgPSB5bWRfaG1zKENsb2NrLlRvZGF5KSklPiUNCiMgICAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKENsb2NrLlRvZGF5PiIyMDAyLTA2LTAxIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihOYW1lPT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwiKQ0KIyAgIHNpbUQxJFZhcmlhYmxlPC0gZmFjdG9yKCBzaW1EMSRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKSAgDQojIFJvb3QuTDwtUm9vdC5kZkElPiUNCiMgICBkcGx5cjo6ZmlsdGVyKE5hbWU9PWMoIkl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikpDQojICAgDQogIA0KRTNJTEwlPiUNCiAgZHBseXI6OmZpbHRlcihHcm93dGhTZWFzb24ueD09IjIiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lMTCIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCkiKSkrDQogICNnZW9tX3BvaW50KGRhdGE9Um9vdC5MLGFlcyh4PUNsb2NrLlRvZGF5MSx5PVJvb3RXdCxzaXplPTIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCiNnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSUxMLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpFM0lMTCU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogICNnZW9tX2xpbmUoeT01NTAwLHNpemU9MikrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lMTCIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCkiKSkrDQogICNnZW9tX3BvaW50KGRhdGE9Um9vdC5MLGFlcyh4PUNsb2NrLlRvZGF5MSx5PVJvb3RXdCxzaXplPTIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCiNnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSUxMLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCiMjI0U1TFMNCg0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCm9ic0RTUiRWYXJpYWJsZTwtIGZhY3RvcihvYnNEU1IkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkUzSUxTPC1vYnNEU1IlPiUNCiAgZmlsdGVyKElEPT0iRTNJTFMiKQ0KRTNJTFMlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICAjZ2VvbV9saW5lKHk9NTUwMCxzaXplPTIpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTNJTFMiLCIoSXZlcnNlbl85MURlZm9saWF0aW9uTFMpIikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTNJTFMucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCiMjI0U1U0wNCg0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCm9ic0RTUiRWYXJpYWJsZTwtIGZhY3RvcihvYnNEU1IkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkUzSVNMPC1vYnNEU1IlPiUNCiAgZmlsdGVyKElEPT0iRTNJU0wiKQ0KRTNJU0wlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lTTCIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25TTCkiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSVNMLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQojI0UzSVNTDQpgYGB7cixmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0Kb2JzRFNSJFZhcmlhYmxlPC0gZmFjdG9yKG9ic0RTUiRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKQ0KRTNJU1M8LW9ic0RTUiU+JQ0KICBmaWx0ZXIoSUQ9PSJFM0lTUyIpDQpFM0lTUyU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIyBnZW9tX2xpbmUoeT01NTAwLHNpemU9MikrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lTUyIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25TUykiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSVNTLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCiMjI0U1SUxMRjUNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpPYnNSUzEkVmFyaWFibGU8LSBmYWN0b3IoT2JzUlMxJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFNUlMTEY1PC1PYnNSUzElPiUNCiAgZmlsdGVyKElEPT0iRTVJTExGNSIpDQojIHNpbUQxPC1zaW1EJT4lDQojICAgIG11dGF0ZShDbG9jay5Ub2RheSA9IHltZF9obXMoQ2xvY2suVG9kYXkpKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKFZhcmlhYmxlPT0iUm9vdFd0InxWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoQ2xvY2suVG9kYXk+IjIwMDItMDYtMDEiKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKE5hbWU9PSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpDQojICAgc2ltRDEkVmFyaWFibGU8LSBmYWN0b3IoIHNpbUQxJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpICANCiMgUm9vdC5MPC1Sb290LmRmQSU+JQ0KIyAgIGRwbHlyOjpmaWx0ZXIoTmFtZT09YygiSXZlcnNlbl85MURlZm9saWF0aW9uTEwiKSkNCiMgICANCiAgDQpFNUlMTEY1JT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCxjb2xvcj1WYXJpYWJsZSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCkpK2dlb21fcG9pbnQoc2l6ZT0zKSsNCiAgZmFjZXRfZ3JpZChWYXJpYWJsZX5JRCkrZ2d0aXRsZShwYXN0ZTAoIkU1SUxMRjUiLCIoSXZlcnNlbl8xMjFEZWZvbGlhdGlvbkxMRkQ1KSIpKSsNCiAgI2dlb21fcG9pbnQoZGF0YT1Sb290LkwsYWVzKHg9Q2xvY2suVG9kYXkxLHk9Um9vdFd0LHNpemU9MikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0U1SUxMRjUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCg0KIyNFNUlTU0Y1DQpgYGB7cixmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0Kb2JzRFNSJFZhcmlhYmxlPC0gZmFjdG9yKG9ic0RTUiRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKQ0KRTVJU1NGNTwtb2JzRFNSJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKQ0KRTVJU1NGNSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlTU0Y1IiwiKEl2ZXJzZW5fMTIxRGVmb2xpYXRpb25TU0ZENSkiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTVJU1NGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQojIyNsb2FkIFJvb3QgYW5kIHNob290IGRhdGEgZm9yIEhIDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpvYnNEU1IkVmFyaWFibGU8LSBmYWN0b3Iob2JzRFNSJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFNUlISEZENTwtb2JzRFNSJT4lDQogIGZpbHRlcihJRD09IkU1SUhIRjUiKSU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249cGFzdGUwKEdyb3d0aFNlYXNvbixSb3RhdGlvbikpDQpFNUlISEZENSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlISEY1IiwiKEl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZENSkiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTVJSEhGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCm9ic0RTUiRWYXJpYWJsZTwtIGZhY3RvcihvYnNEU1IkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUhIRkQyPC1vYnNEU1IlPiUNCiAgZmlsdGVyKElEPT0iRTVJSEhGMiIpJT4lDQogIG11dGF0ZShHcm93dGhSb3RhdGlvbj1wYXN0ZTAoR3Jvd3RoU2Vhc29uLFJvdGF0aW9uKSkNCkU1SUhIRkQyJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCxjb2xvcj1WYXJpYWJsZSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCkpK2dlb21fcG9pbnQoc2l6ZT0zKSsNCiAgZmFjZXRfZ3JpZChWYXJpYWJsZX5JRCkrZ2d0aXRsZShwYXN0ZTAoIkU1SUhIRjUiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0U1SUhIRjIucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCg0KDQojI0U1SUxMRjIgDQpgYGB7cn0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUxMRjI8LU9ic1JTMSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlMTEYyIikNCiMgc2ltRDE8LXNpbUQlPiUNCiMgICAgbXV0YXRlKENsb2NrLlRvZGF5ID0geW1kX2htcyhDbG9jay5Ub2RheSkpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJSb290V3QifFZhcmlhYmxlPT0ic2hvb3RiaW9tYXNzIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihDbG9jay5Ub2RheT4iMjAwMi0wNi0wMSIpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoTmFtZT09Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikNCiMgICBzaW1EMSRWYXJpYWJsZTwtIGZhY3Rvciggc2ltRDEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkgIA0KIyBSb290Lkw8LVJvb3QuZGZBJT4lDQojICAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpKQ0KIyAgIA0KICANCkU1SUxMRjIlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKSsNCiAgI2dlb21fcG9pbnQoZGF0YT1Sb290LkwsYWVzKHg9Q2xvY2suVG9kYXkxLHk9Um9vdFd0LHNpemU9MikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEYyLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCiMjI0U1SUxMRjEwDQpgYGB7cn0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUxMRjEwPC1PYnNSUzElPiUNCiAgZmlsdGVyKElEPT0iRTVJTExGMTAiKQ0KIyBzaW1EMTwtc2ltRCU+JQ0KIyAgICBtdXRhdGUoQ2xvY2suVG9kYXkgPSB5bWRfaG1zKENsb2NrLlRvZGF5KSklPiUNCiMgICAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKENsb2NrLlRvZGF5PiIyMDAyLTA2LTAxIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihOYW1lPT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwiKQ0KIyAgIHNpbUQxJFZhcmlhYmxlPC0gZmFjdG9yKCBzaW1EMSRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKSAgDQojIFJvb3QuTDwtUm9vdC5kZkElPiUNCiMgICBkcGx5cjo6ZmlsdGVyKE5hbWU9PWMoIkl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikpDQojICAgDQogIA0KRTVJTExGMTAlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKSsNCiAgI2dlb21fcG9pbnQoZGF0YT1Sb290LkwsYWVzKHg9Q2xvY2suVG9kYXkxLHk9Um9vdFd0LHNpemU9MikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEYxMC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQoNCiMjI3Byb29mDQoNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NCg0Kb2JzRFNSUjwtb2JzRFNSJT4lDQogIGZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCIpJT4lDQogIG11dGF0ZShSb290V3Q9T2JzZXJ2ZWQpDQpvYnNEU1JTPC1vYnNEU1IlPiUNCiAgIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoTmFtZSxDbG9jay5Ub2RheSxPYnNlcnZlZCklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCklPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5PXltZChDbG9jay5Ub2RheSkpJT4lDQogIG11dGF0ZShOYW1lPWZhY3RvcihOYW1lKSkNCiANCkFsbDwtbWVyZ2Uob2JzRFNSUixvYnNEU1JTLGJ5PWMoIkNsb2NrLlRvZGF5IiwiTmFtZSIpKSU+JQ0KICBtdXRhdGUoQmlvbWFzcz1Sb290V3Qrc2hvb3RiaW9tYXNzKSU+JQ0KICBtdXRhdGUoUHJvb3Q9MS1zaG9vdGJpb21hc3MvQmlvbWFzcyklPiUNCiAgbXV0YXRlKEdyb3d0aFJvdGF0aW9uPXBhc3RlMChHcm93dGhTZWFzb24sUm90YXRpb24pKQ0KDQpBbGwlPiUNCiAgZmlsdGVyKEV4cGVyaW1lbnRJRD09IkUzIiklPiUNCiAgdW5pcXVlKCklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVByb290LGNvbG9yPUlELGxhYmVsPUdyb3d0aFJvdGF0aW9uKSkrZ2VvbV90ZXh0KCkrDQogIHRoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiUHJvb3QiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0UzUHJvb3QucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCmBgYHtyLGhlaWdodD00LCBmaWcud2lkdGg9OH0NCkFsbCU+JQ0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9UHJvb3QsY29sb3I9SUQsbGFiZWw9R3Jvd3RoUm90YXRpb24pKStnZW9tX3RleHQoKSsNCiAgdGhlbWVfYncoKSsNCiAgZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDEpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJQcm9vdCIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTVQcm9vdC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQojIyNQcm9vdCBMTA0KYGBge3IsaGVpZ2h0PTQsIGZpZy53aWR0aD04fQ0KT2JzUlMxUjwtT2JzUlMxJT4lDQogIGZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCIpJT4lDQogIG11dGF0ZShSb290V3Q9T2JzZXJ2ZWQpDQpPYnNSUzFTPC1PYnNSUzElPiUNCiAgIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoTmFtZSxDbG9jay5Ub2RheSxPYnNlcnZlZCklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCklPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5PXltZChDbG9jay5Ub2RheSkpJT4lDQogIG11dGF0ZShOYW1lPWZhY3RvcihOYW1lKSkNCiANCkxMQWxsPC1tZXJnZShPYnNSUzFSLE9ic1JTMVMsYnk9YygiQ2xvY2suVG9kYXkiLCJOYW1lIikpJT4lDQogIGZpbHRlcihUYmI9PTEpJT4lDQogIG11dGF0ZShCaW9tYXNzPVJvb3RXdCtzaG9vdGJpb21hc3MpJT4lDQogIG11dGF0ZShQcm9vdD0xLXNob290YmlvbWFzcy9CaW9tYXNzKSU+JQ0KICB1bmlxdWUoKQ0KDQpMTEFsbCU+JQ0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9UHJvb3QsY29sb3I9SUQsbGFiZWw9R3Jvd3RoUm90YXRpb24pKStnZW9tX3RleHQoKSsNCiAgdGhlbWVfYncoKSsNCiAgZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDEpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJQcm9vdCIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTNMTFByb290LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyLGhlaWdodD00LCBmaWcud2lkdGg9OH0NCkxMQWxsJT4lDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFNSIpJT4lDQogIGZpbHRlcihzaG9vdGJpb21hc3MhPSIwIiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVByb290LGNvbG9yPUlELGxhYmVsPUdyb3d0aFJvdGF0aW9uKSkrZ2VvbV9saW5lKHNpemU9MikrDQogIHRoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiUHJvb3QiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0U1TExQcm9vdC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQoNCiMjI0N1bSBvYmVydmVkDQpgYGB7cn0NCnVuZ3JvdXAucm93d2lzZV9kZiA8LSBmdW5jdGlvbih4KSB7DQogIGNsYXNzKHgpIDwtIGMoICJ0YmxfZGYiLCAiZGF0YS5mcmFtZSIpDQogIHgNCn0NCg0KRTVJSEhGRDVTPC1FNUlISEZENSU+JQ0KZHBseXI6OmZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpDQoNCg0KdW5pR1kgPC0gdW5pcXVlKEU1SUhIRkQ1UyRFeHBVbml0Q29kZSkNCg0KDQoNCmRmLmFsbCA8LSBkYXRhLmZyYW1lKCkNCiANCmZvcihpIGluIDE6bGVuZ3RoKHVuaUdZKSl7DQogIA0KIGN1bTwtRTVJSEhGRDVTJT4lDQogICByb3d3aXNlKCkgJT4lDQogICBtdXRhdGUoR3Jvd3RoUm90YXRpb249cGFzdGUwKEdyb3d0aFJvdGF0aW9uLFJvdGF0aW9uKSklPiUNCiAgdW5ncm91cC5yb3d3aXNlX2RmKCklPiUNCiAgbXV0YXRlKFNob290PWN1bXN1bShPYnNlcnZlZCkpDQogDQogZGYuYWxsIDwtIHJiaW5kKGRmLmFsbCxjdW0pDQogfQ0KICANCnN1bW1hcnkoZGYuYWxsKQ0KZGYuYWxsDQoNCg0KYGBgDQoNCiMjI2xvYWQgUm9vdCBhbmQgc2hvb3QgZGF0YSBmb3IgU1MNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpvYnNEU1IkVmFyaWFibGU8LSBmYWN0b3Iob2JzRFNSJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFNUlTU0ZENTwtb2JzRFNSJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKQ0KRTVJU1NGRDUlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJU1NGNSIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJU1NGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KIyMjbG9hZCBSb290IGFuZCBzaG9vdCBkYXRhIGZvciBMTA0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUxMRjU8LU9ic1JTMSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlMTEY1IikNCkU1SUxMRjUlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KIyMjIGxvYWQgUm9vdCBkYXRhIGFuYWx5c2lzIGRhdGEgZnJhbWUNCmBgYHtyfQ0KdXBEaXIgPC0gIkQ6L1IvIg0KUm9vdGRmIDwtICJEOi9SL0NvbWJpbmVkRGF0YS8iDQoNClJvb3QuZGY8LSByZWFkLnRhYmxlKHBhc3RlMChSb290ZGYsICJSb290LmRhdGFmcmFtZS50eHQiKSwNCiAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpDQpSb290LmRmQSA8LSBSb290LmRmICU+JSBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydERhdGU9ZG15KFN0YXJ0RGF0ZSksRmluaXNoRGF0ZT1kbXkoRmluaXNoRGF0ZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnREYXRlMT1kbXkoU3RhcnREYXRlMSksRmluaXNoRGF0ZTE9ZG15KEZpbmlzaERhdGUxKSklPiUNCiAgIG11dGF0ZShDbG9jay5Ub2RheTEgPSBhcy5QT1NJWGN0KHBhc3RlKENsb2NrLlRvZGF5LFRpbWUpLGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiKSkNCmBgYA0KDQojI1JlbW9ibGlzYXRpb24gDQoNCmBgYHtyfQ0KUm9vdC5ISDwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290LkhIMTwtUm9vdC5ISCU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9Q2hhbmdlV3QsIGNvbHVyPU5hbWUpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKStteXRoZW1lMw0KYGBgDQoNCmBgYHtyfQ0KUm9vdC5MTDwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290LkhILmdyYXBoPC1Sb290LmRmQSU+JQ0KICBkcGx5cjo6ZmlsdGVyKElEPT1jKCJFNUlISEY1IikpJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVJvb3RXdCkpK2dlb21fbGluZShzaXplPTEuNSkrdGhlbWVfYncoKStteXRoZW1lMw0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9TaW1wbGVFM0hILnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KYGBgDQojI3JlbW9ibGlzYXRpb24gRE0gYW5kIHN0cnVjdHVyYWwgRE0NCmBgYHtyLGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTh9DQpSb290LkxMMTwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzEyMURlZm9saWF0aW9uTExGREZENSIpKSU+JQ0KIGRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNClJvb3QuTEwxYTwtUm9vdC5MTDElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2x1cj1OYW1lKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMNCg0KUmVSb290PC1yYmluZChSb290LkhILFJvb3QuTEwsUm9vdC5MTDEpDQoNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSZVJvb3Qpew0KICBtIDwtIGxtKENoYW5nZVd0fklSVyAsIFJlUm9vdCk7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVyArIENoYW5nZVd0ICUuJSBpdGFsaWMoSVJXKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChJUlc9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VXdCA9IGZvcm1hdChjb2VmKG0pWzJdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByMiA9IGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMykpKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihlcSkpOyAgICAgICAgICAgICAgICAgDQp9DQoNCg0KZXFzIDwtIGRkcGx5KFJlUm9vdCwuKFRyZW5kKSxsbV9lcW4xKQ0KDQpSZVJvb3QlPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fdGV4dChkYXRhID0gZXFzLCBhZXMoeCA9NzAwMCwgeSA9NzAwMCwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkrDQogIGdndGl0bGUoIlJlbW9ibGlzYXRpb24gcG90ZW50aWFsIikNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZW1vYmxpc2F0aW9uSEwucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCiMjcmVtb2JsaXNhdGlvbiByYXRlDQpgYGB7ciwsZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OH0NClJlUm9vdC5SYXRlPC1SZVJvb3QlPiUNCiAgbXV0YXRlKFJlLnJhdGU9Q2hhbmdlV3QvQ2hhbmdlVHQpJT4lDQogIG11dGF0ZShSZS5yYXRlLlBwPVJlLnJhdGUvQ2hhbmdlUHApDQoNClJlUm9vdC5SYXRlJT4lDQogIGdncGxvdChhZXMoeD1JUlcseT1SZS5yYXRlLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpDQoNCmBgYA0KDQoNCg0KDQpgYGB7ciwsZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OH0NClJvb3QuTFM8LVJvb3QuZGZBJT4lDQogIGRwbHlyOjpmaWx0ZXIoTmFtZT09YygiSXZlcnNlbl85MURlZm9saWF0aW9uTFMiKSklPiUNCmRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNClJvb3QuU0w8LVJvb3QuZGZBJT4lDQogIGRwbHlyOjpmaWx0ZXIoTmFtZT09YygiSXZlcnNlbl85MURlZm9saWF0aW9uU0wiKSklPiUNCiAgZHBseXI6OmZpbHRlcihUcmVuZD09IlJCIikNCg0KUm9vdC5TUzwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25TUyIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290LlNTYTwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzEyMURlZm9saWF0aW9uU1NGREZENSIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290U1M8LXJiaW5kKFJvb3QuTFMsUm9vdC5TTCxSb290LlNTLFJvb3QuU1NhKQ0KDQoNCmxpYnJhcnkocGx5cikNCmxtX2VxbjEgPC0gZnVuY3Rpb24oUm9vdFNTKXsNCiAgbSA8LSBsbShDaGFuZ2VXdH5JUlcgLCBSb290U1MpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBJUlcgKyBDaGFuZ2VXdCAlLiUgaXRhbGljKElSVykqIiwifn5pdGFsaWMoUileMn4iPSJ+cjIsIA0KICAgICAgICAgICAgICAgICAgIGxpc3QoSVJXPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlV3QgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEgPC0gZGRwbHkoUm9vdFNTLC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3RTUyU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9Q2hhbmdlV3QsIGNvbG9yPUlEKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMreGxhYihicXVvdGUoYm9sZCgnSW50aWFsIHJvb3QgYmlvbWFzcyAoJyprZ35ETX5oYV4tMSonKScpKSkreWxhYihicXVvdGUoYm9sZCgnUmVtb2JsaXNhdGlvbiBsb3N0ICgnKmtnfkRNfmhhXi0xKicpJykpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxLCBhZXMoeCA9NDAwMCwgeSA9MjUwMCwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZW1vYmxpc2F0aW9uc3MucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KDQojIyMjIw0KDQoNCmBgYHtyfQ0KUm9vdC5kZkExPC1Sb290LmRmQSU+JQ0KICAgICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpsaWJyYXJ5KHBseXIpDQpsbV9lcW4xIDwtIGZ1bmN0aW9uKFJvb3QuZGZBMSl7DQogIG0gPC0gbG0oQ2hhbmdlV3R+SVJXICwgUm9vdC5kZkExKTsNCiAgZXEgPC0gc3Vic3RpdHV0ZShpdGFsaWMoeSkgPT0gSVJXICsgQ2hhbmdlV3QgJS4lIGl0YWxpYyhJUlcpKiIsIn5+aXRhbGljKFIpXjJ+Ij0ifnIyLCANCiAgICAgICAgICAgICAgICAgICBsaXN0KElSVz0gZm9ybWF0KGNvZWYobSlbMV0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVd0ID0gZm9ybWF0KGNvZWYobSlbMl0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQogIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7ICAgICAgICAgICAgICAgICANCn0NCg0KDQplcXMxIDwtIGRkcGx5KFJvb3QuZGZBMSwuKFRyZW5kKSxsbV9lcW4xKQ0KDQpSb290LmRmQTElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikrDQogIGdlb21fdGV4dChkYXRhID0gZXFzMSwgYWVzKHggPTYwMDAsIHkgPTYwMDAsIGxhYmVsID0gVjEpLCANCiAgICAgICAgICBjb2xvciA9ICdibGFjaycsICBwYXJzZSA9IFRSVUUpDQogZGV0YWNoKHBhY2thZ2U6cGx5cikNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vUmVtb2JsaXNhdGlvbkFMTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KDQpgYGANCmBgYHtyfQ0KUm9vdC5kZkExPC1Sb290LmRmQSU+JQ0KICAgICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKSU+JQ0KICBtdXRhdGUoUGVyPUNoYW5nZVd0L0lSVykNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LmRmQTEpew0KICBtIDwtIGxtKFBlcn5JUlcgLCBSb290LmRmQTEpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBJUlcgKyBQZXIgJS4lIGl0YWxpYyhJUlcpKiIsIn5+aXRhbGljKFIpXjJ+Ij0ifnIyLCANCiAgICAgICAgICAgICAgICAgICBsaXN0KElSVz0gZm9ybWF0KGNvZWYobSlbMV0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIFBlciA9IGZvcm1hdChjb2VmKG0pWzJdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByMiA9IGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMykpKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihlcSkpOyAgICAgICAgICAgICAgICAgDQp9DQoNCg0KZXFzMTEgPC0gZGRwbHkoUm9vdC5kZkExLC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3QuZGZBMSU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9UGVyLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoIlJlbW9ibGlzYXRpb24gbG9zdCglKSIpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpKw0KICBnZW9tX3RleHQoZGF0YSA9IGVxczExLCBhZXMoeCA9NjAwMCwgeSA9MC43NSwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZW1vYmxpc2F0aW9uQUxMcGVyLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQoNCmBgYA0KDQoNCg0KYGBge3J9DQpSb290LmRmQTE8LVJvb3QuZGZBJT4lDQogICAgIGRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNCmxpYnJhcnkocGx5cikNCm15LmZvcm11bGEgIDwtIGZ1bmN0aW9uKFJvb3QuZGZBMSl7DQogIG15LmZvcm11bGEgPC0gQ2hhbmdlV3QgfiBwb2x5KElSVywgMiwgcmF3ID0gVFJVRSkNCiAgbSA8LSBsbShteS5mb3JtdWxhLCBSb290LmRmQTEpDQogIG15LmVxIDwtIGFzLmNoYXJhY3RlcihzaWduaWYoYXMucG9seW5vbWlhbChjb2VmKG0pKSwgMikpDQogIGxhYmVsLnRleHQgPC0gcGFzdGUoInkiLCInPSciLHBhc3RlKGdzdWIoInkiLCAifml0YWxpYyh4KSIsbXkuZXEsIGZpeGVkID0gVFJVRSkpLA0KICAgICAgICAgICAgICBwYXN0ZSgiaXRhbGljKFIpXjIiLGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICBzZXAgPSAifmA9YH4iKSwNCiAgICAgICAgICAgICAgICAgICAgc2VwID0gIn5+fn4iKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihsYWJlbC50ZXh0KSk7ICAgICAgICAgICAgICAgICANCn0NCg0KbXkuZXFzIDwtIGRkcGx5KFJvb3QuZGZBMSwuKEZEKSxteS5mb3JtdWxhKQ0KDQpiPC1Sb290LmRmQTElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgZm9ybXVsYT15IH4gcG9seSh4LCAyLCByYXc9VFJVRSksIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KDQpiK2dlb21fdGV4dChkYXRhID0gbXkuZXFzLCBhZXMoeCA9IDYwMDAsIHkgPSA2MDAwLCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTQpDQogIA0KIGRldGFjaChwYWNrYWdlOnBseXIpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUmVtb2JsaXNhdGlvbkFMTHBsb3kyLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQoNCmBgYA0KYGBge3J9DQpSb290LmRmQTE8LVJvb3QuZGZBJT4lDQogICAgIGRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNCmxpYnJhcnkocGx5cikNCm15LmZvcm11bGEgIDwtIGZ1bmN0aW9uKFJvb3QuZGZBMSl7DQogIG15LmZvcm11bGEgPC0gQ2hhbmdlV3QgfiBwb2x5KElSVywgMywgcmF3ID0gVFJVRSkNCiAgbSA8LSBsbShteS5mb3JtdWxhLCBSb290LmRmQTEpDQogIG15LmVxIDwtIGFzLmNoYXJhY3RlcihzaWduaWYoYXMucG9seW5vbWlhbChjb2VmKG0pKSwgMikpDQogIGxhYmVsLnRleHQgPC0gcGFzdGUoInkiLCInPSciLHBhc3RlKGdzdWIoInkiLCAifml0YWxpYyh4KSIsbXkuZXEsIGZpeGVkID0gVFJVRSkpLA0KICAgICAgICAgICAgICBwYXN0ZSgiaXRhbGljKFIpXjIiLGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICBzZXAgPSAifmA9YH4iKSwNCiAgICAgICAgICAgICAgICAgICAgc2VwID0gIn5+fn4iKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihsYWJlbC50ZXh0KSk7ICAgICAgICAgICAgICAgICANCn0NCg0KbXkuZXFzIDwtIGRkcGx5KFJvb3QuZGZBMSwuKEZEKSxteS5mb3JtdWxhKQ0KDQpiPC1Sb290LmRmQTElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgZm9ybXVsYT15IH4gcG9seSh4LCAzLCByYXc9VFJVRSksIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KDQpiK2dlb21fdGV4dChkYXRhID0gbXkuZXFzLCBhZXMoeCA9IDY4MDAsIHkgPSA2MDAwLCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTQpDQogIA0KIGRldGFjaChwYWNrYWdlOnBseXIpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL1JlbW9ibGlzYXRpb25BTExwbG95My5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KDQpgYGANCg0KDQoNCiMjcmVtb2JsaXNhdGlvbiByYXRlDQpgYGB7cn0NClJvb3QuZGZBTEw8LVJvb3QuZGZBMSU+JQ0KICBtdXRhdGUoUmUucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFJlLnJhdGUuUHA9UmUucmF0ZS9DaGFuZ2VQcCkNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LmRmQUxMKXsNCiAgbSA8LSBsbShSZS5yYXRlfklSVyAsIFJvb3QuZGZBTEwpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBJUlcgKyBSZS5yYXRlICUuJSBpdGFsaWMoSVJXKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChJUlc9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBSZS5yYXRlID0gZm9ybWF0KGNvZWYobSlbMl0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQogIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7ICAgICAgICAgICAgICAgICANCn0NCg0KDQplcXMxMSA8LSBkZHBseShSb290LmRmQUxMLC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3QuZGZBTEwlPiUNCmdncGxvdChhZXMoeD1JUlcseT1SZS5yYXRlLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzKw0KICB4bGFiKGJxdW90ZShib2xkKCdJbnRpYWwgcm9vdCBiaW9tYXNzICgnKmtnfmhhXi0xKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdSZW1vYmxpc2F0aW9uICByYXRlICgnKmtnfmNkXi0xKicpJykpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxMSwgYWVzKHggPTYwMDAsIHkgPTQsIGxhYmVsID0gVjEpLCANCiAgICAgICAgICBjb2xvciA9ICdibGFjaycsICBwYXJzZSA9IFRSVUUpDQogZGV0YWNoKHBhY2thZ2U6cGx5cikNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vUmVtb2JsaXNhdGlvbiByYXRlLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQoNCmBgYA0KDQojIyMjcm9vdCByZXNwaXJhdGlvbiByYXRlIFNTDQpgYGB7cixmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD04fQ0KUm9vdFNTLlJhdGU8LVJvb3RTUyU+JQ0KICBtdXRhdGUoUmUucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFJlLnJhdGUuUHA9UmUucmF0ZS9DaGFuZ2VQcCkNCg0KUm9vdFNTLlJhdGUlPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PVJlLnJhdGUsIGNvbG9yPUlEKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikNCg0KYGBgDQoNCg0KIyMjd2hlbiBwYXJ0aXRpb25pbmcgc3RhcnQ/IFBwDQoNCmBgYHtyfQ0KUm9vdC5QVDwtUm9vdC5kZkElPiUNCiAgZmlsdGVyKFRyZW5kPT0iUFQiKSU+JQ0KICBtdXRhdGUoUHQucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFB0LnJhdGUuUHA9UHQucmF0ZS9DaGFuZ2VQcCklPiUNCiAgbXV0YXRlKFBUUj1DaGFuZ2VXdC9JUlcpDQoNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LlBUKXsNCiAgbSA8LSBsbShIUld+SVJXICwgUm9vdC5QVCk7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVysgSFJXICUuJSBpdGFsaWMoSVJXKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChJUlc9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBIUlcgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEyIDwtIGRkcGx5KFJvb3QuUFQsLihUcmVuZCksbG1fZXFuMSkNCg0KUm9vdC5QVCU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9SFJXLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK2dndGl0bGUoIlJlY2hhcmdpbmcgcG90ZW50aWFsICIpKw0KICB4bGFiKGJxdW90ZShib2xkKCdJbml0YWwgcm9vdCBiaW9tYXNzICgnKmtnfmhhXi0xKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdNYXhpbXVtIHJvb3QgYm9tYXNzICgnKmtnfmhhXi0xKicpJykpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxMiwgYWVzKHggPTQwMDAsIHkgPTg4MDAsIGxhYmVsID0gVjEpLCANCiAgICAgICAgICBjb2xvciA9ICdibGFjaycsICBwYXJzZSA9IFRSVUUpDQogZGV0YWNoKHBhY2thZ2U6cGx5cikNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vUmVjaGFuZ2luZyBwb3RlbnRpYWwucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KIyMjd2hlbiBwYXJ0aXRpb25pbmcgc3RhcnQ/IFBwDQojIyNSZWNoYXJnaW5nIHJhdGUNCmBgYHtyfQ0KUm9vdC5QVDwtUm9vdC5kZkElPiUNCiAgZmlsdGVyKFRyZW5kPT0iUFQiKSU+JQ0KICBtdXRhdGUoUHQucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFB0LnJhdGUuUHA9UHQucmF0ZS9DaGFuZ2VQcCklPiUNCiAgbXV0YXRlKFBUUj1DaGFuZ2VXdC9JUlcpDQoNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LlBUKXsNCiAgbSA8LSBsbShIUld+UHQucmF0ZSAsIFJvb3QuUFQpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBQdC5yYXRlKyBIUlcgJS4lIGl0YWxpYyhQdC5yYXRlKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChQdC5yYXRlPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgSFJXID0gZm9ybWF0KGNvZWYobSlbMl0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQogIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7ICAgICAgICAgICAgICAgICANCn0NCg0KDQplcXMxMiA8LSBkZHBseShSb290LlBULC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3QuUFQlPiUNCiAgZ2dwbG90KGFlcyh4PVB0LnJhdGUseT1IUlcsIGNvbG9yPUlEKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMrZ2d0aXRsZSgiUmVjaGFyZ2luZyByYXRlICIpKw0KICB4bGFiKGJxdW90ZShib2xkKCdSZWNoYXJnaW5nIHJhdGUgKCcqa2d+Y2ReLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ01heGltdW0gcm9vdCBib21hc3MgKCcqa2d+aGFeLTEqJyknKSkpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpKw0KICBnZW9tX3RleHQoZGF0YSA9IGVxczEyLCBhZXMoeCA9MiwgeSA9ODgwMCwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZWNoYW5naW5nIHJhdGUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KDQoNCg0KIyMjUm9vdFBUIGluIExMIGFuZCBISA0KYGBge3J9DQpSb290LlBUTEg8LVJvb3QuUFQlPiUNCiAgZHBseXI6OmZpbHRlcihJRCE9IkUzSUxMIiklPiUNCiAgZHBseXI6OmZpbHRlcihJRCE9IkU1SUxMRjUiKSU+JSANCiAgZHBseXI6OmZpbHRlcihJRCE9IkU1SUhIRjUiKQ0KUm9vdC5QVExIJT4lDQogIGdncGxvdChhZXMoeD1JUlcseT1DaGFuZ2VXdCwgY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKStteXRoZW1lMytnZ3RpdGxlKCJSZWNoYXJnaW5nIHBvdGVudGlhbCIpDQogICNnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpDQoNCmBgYA0KDQpgYGB7cn0NClJvb3QuUFRMSCU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9UHQucmF0ZSwgY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKStteXRoZW1lMytnZ3RpdGxlKCJSZWNoYXJnaW5nIHBvdGVudGlhbCIpDQogICNnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpDQpgYGANCg0KIyMjUmVzcGlyYXRpb24gUmF0ZSBhbmQgaW50aWFsIGJpb21hc3MNCg0KYGBge3IsZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OH0NClJvb3QuZGZSPC1Sb290LmRmQSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJSUCIpJT4lDQogIG11dGF0ZShSUC5yYXRlPUNoYW5nZVd0L0NoYW5nZVR0KSU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249cGFzdGUoR3Jvd3RoU2Vhc29uLFJvdGF0aW9uKSkNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LmRmUil7DQogIG0gPC0gbG0oUlAucmF0ZX5JUlcgLCBSb290LmRmUik7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVysgUlAucmF0ZSAlLiUgaXRhbGljKFJQLnJhdGUpKiIsIn5+aXRhbGljKFIpXjJ+Ij0ifnIyLCANCiAgICAgICAgICAgICAgICAgICBsaXN0KElSVz0gZm9ybWF0KGNvZWYobSlbMV0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIFJQLnJhdGUgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEyIDwtIGRkcGx5KFJvb3QuZGZSLC4oVHJlbmQpLGxtX2VxbjEpDQoNCmRldGFjaChwYWNrYWdlOnBseXIpDQoNClJvb3QuZGZSJT4lDQogIGdncGxvdChhZXMoeD1JUlcsIHk9UlAucmF0ZSxjb2xvcj1JRCxsYWJlbD1Hcm93dGhSb3RhdGlvbikpK2dlb21fdGV4dCgpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIHhsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlcGlyYXRpb24gcmF0ZSAoJyprZ35DZF4tMSonKScpKSkrZ2d0aXRsZSgiUmVzcGlyYXRpb24gaW4gV2ludGVyIikrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikrDQogIGdlb21fdGV4dChkYXRhID0gZXFzMTIsIGFlcyh5PTYsIHggPTUwMDAsIGxhYmVsID0gVjEpLA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCg0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SZXNwaWFydGlvbiByYXRlLnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KIHdyaXRlLmNzdihSb290LmRmUiwiRDovUi9SZXNwaXJhdGlvbi9Sb290LmRmUi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCiAgDQpgYGANCg0KIyMjcmVzcGlyYXRpb24gYW5kIHN0cnVjdHVyYWwgcm9vdCBiaW9tYXNzDQojIyNzdHJ1Y3R1cmFsIHJvb3QgaXMgcGVyY2VudGFnZSBvZiB0b3RhbCByb290IGJpb21hc3MNCmBgYHtyfQ0KUm9vdC5kZnBlcjwtUm9vdC5kZkElPiUNCiAgZmlsdGVyKFRyZW5kPT0iUlAiKSU+JQ0KICBtdXRhdGUoUGVyPTEtQ2hhbmdlVHQvSVJXKSU+JQ0KICAgbXV0YXRlKEdyb3d0aFJvdGF0aW9uPWFzLmZhY3RvcihwYXN0ZShHcm93dGhTZWFzb24sUm90YXRpb24pKSklPiUNCiAgZHBseXI6OmZpbHRlcihHcm93dGhTZWFzb24hPSIyInxSb3RhdGlvbiE9IjEwIikNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMTEgPC0gZnVuY3Rpb24oUm9vdC5kZnBlcil7DQogIG0gPC0gbG0oQ2hhbmdlV3R+SVJXICwgUm9vdC5kZnBlcik7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVysgQ2hhbmdlV3QgJS4lIGl0YWxpYyhDaGFuZ2VXdCkqIiwifn5pdGFsaWMoUileMn4iPSJ+cjIsIA0KICAgICAgICAgICAgICAgICAgIGxpc3QoSVJXPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlV3QgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEzIDwtIGRkcGx5KFJvb3QuZGZwZXIsLihUcmVuZCksbG1fZXFuMTEpDQoNCmRldGFjaChwYWNrYWdlOnBseXIpDQoNClJvb3QuZGZwZXIlPiUNCiAgZ2dwbG90KGFlcyh4PUlSVywgeT1DaGFuZ2VXdCxjb2xvcj1JRCxsYWJlbD1Hcm93dGhSb3RhdGlvbikpK2dlb21fdGV4dCgpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIHhsYWIoYnF1b3RlKGJvbGQoJ0luaXRpYWwgcm9vdCBiaW9tYXNzICgnKmtnfmhhXi0xKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdSb290IHJlc3BpcmF0aW9uICgnKmtnfmhhXi0xKicpJykpKStnZ3RpdGxlKCJSZXNwaXJhdGlvbiBpbiBXaW50ZXIiKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxMywgYWVzKHk9MjAwMCwgeCA9NjAwMCwgbGFiZWwgPSBWMSksDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFKQ0KDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL3Jvb3RzdHVyY3R1cmFsLnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KICN3cml0ZS5jc3YoUm9vdC5kZlIsIkQ6L1IvUmVzcGlyYXRpb24vUm9vdC5kZlIuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCiAjIyNzdHJ1Y3R1cmFsIHJvb3QgYmlvbWFzcz0yNDkxLjMwDQoNCmBgYA0KDQojIyMgZGFpbHkgd2ludGVyIHJlc3BpcmF0aW9uIA0KYGBge3IsLGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTh9DQp1cERpciA8LSAiRDovUi8iDQpSb290ZGYgPC0gIkQ6L1IvUmVzcGlyYXRpb24vIg0KDQpSb290UmVzcDwtIHJlYWQudGFibGUocGFzdGUwKFJvb3RkZiwgIlJvb3RSZXNwLnR4dCIpLA0KICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNClJvb3QucmVzcCA8LSBSb290UmVzcCAlPiUgbXV0YXRlKENsb2NrLlRvZGF5PWRteShDbG9jay5Ub2RheSkpJT4lDQogIGZpbHRlcihGaW5pYWxSVyE9Ik5BIiklPiUNCiAgZHBseXI6OnNlbGVjdChOYW1lLENsb2NrLlRvZGF5LFRlYXJ0aCxHcm93dGhSb3RhdGlvbixGaW5pYWxSVyxSbV9yb290X2RheTEsUm1fcm9vdF9kYXkyLFJtX3Jvb3RfZGF5MywgUm1fcm9vdF9kYXk0LCBSbV9yb290X2RheTUsUm1fcm9vdF9kYXk2LFJtX3Jvb3RfZGF5NyxSbV9yb290X2RheTgsUm1fcm9vdF9kYXk5LFJtX3Jvb3RfZGF5MTApICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUm1fcm9vdF9kYXkxOlJtX3Jvb3RfZGF5MTApDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMInxHcm93dGhSb3RhdGlvbiE9IjMxIikNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl8xMjFEZWZvbGlhdGlvbkhIRkRGRDUiKQ0KDQpSb290LnJlc3AkVmFyaWFibGU8LSBmYWN0b3IoUm9vdC5yZXNwJFZhcmlhYmxlLCBsZXZlbHM9YygiUm1fcm9vdF9kYXkxIiwgIlJtX3Jvb3RfZGF5MiIsICJSbV9yb290X2RheTMiLCAiUm1fcm9vdF9kYXk0IiwgIlJtX3Jvb3RfZGF5NSIsIlJtX3Jvb3RfZGF5NiIsICJSbV9yb290X2RheTciLCJSbV9yb290X2RheTgiLCJSbV9yb290X2RheTkiLCJSbV9yb290X2RheTEwIikpDQpSb290LnJlc3AlPiUNCiAgZ2dwbG90KGFlcyh4PUZpbmlhbFJXLCB5PSBQcmVkaWN0ZWQsIGNvbG91cj0gZmFjdG9yKE5hbWUpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJSb290IGJpb21hc3MiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA0KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikrZ2d0aXRsZSgiUmVzcGlyYXRpb24gaW4gV2ludGVyIikrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiBnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUm1fcm9vdF9kYXkucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQpgYGANCiMjIERlZmluZSBzdGF0cyBmdW5jdGlvbg0KDQoqIFVzaW5nIEdhdWNoIGV0IGFsLiAyMDAzIChNb2RlbCBldmFsdWF0aW9uIGJ5IGNvbXBhcmlzb24gb2YgbW9kZWwtYmFzZWQgcHJlZGljdGlvbnMgYW5kIG1lYXN1cmVkIHZhbHVlcy4gQWdyb24uIEouIDk1LCAxNDQyLTE0NDYpIA0KYGBge3IgU3RhdHMsIGluY2x1ZGUgPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQ0KDQojICMgUjINCiMgdGVzdERGIDwtIGRhdGEuZnJhbWUoYT1jKDEsMiwzLDQsNSksIGI9YygxMCwyMCwxMCw0MCw1MCkpDQojIA0KIyBteVIyIDwtIGZ1bmN0aW9uKHAsbykgew0KIyAgcmV0dXJuKHN1bW1hcnkobG0ocH5vLCBuYS5hY3Rpb249bmEuZXhjbHVkZSkpJHIuc3F1YXJlZCkgDQojIH0NCiMgDQojIHRlc3RERiAlPiUNCiMgICBzdW1tYXJpc2UodGhpc1IyID0gbXlSMihhLGIpKQ0KDQojIGdhdWNoIE1TRSBjb21wb25lbnRzDQpnYXVjaFN0YXRzIDwtIGZ1bmN0aW9uKHNpbSwgbWVhcykgew0KDQogIG5fcyA8LSBsZW5ndGgoc2ltKQ0KICBuX20gPC0gbGVuZ3RoKG1lYXMpDQogIG1vZGVsIDwtIGxtKG1lYXN+c2ltKQ0KICBzaW1fc3EgPC0gc3VtKChzaW0gLSBtZWFuKHNpbSkpXjIpDQogIG1lc19zcSA8LSBzdW0oKG1lYXMgLSBtZWFuKG1lYXMpKV4yKQ0KICByMiA8LSBzdW1tYXJ5KG1vZGVsKSRyLnNxdWFyZWQNCiAgc2xvcGUgPC0gbW9kZWwkY29lZmZpY2llbnRzW1syXV0NCg0KICBzYiA8LSAoc3VtKG1lYW4obWVhcykpIC0gc3VtKG1lYW4oc2ltKSkpXjINCiAgbnUgPC0gKDEtc2xvcGUpXjIgKiAoc2ltX3NxL25fcykNCiAgbGMgPC0gKDEtcjIpICogKG1lc19zcS9uX20pDQogIG1zZCA8LSBzYitudStsYw0KDQogIHNiX3IgPC0gcm91bmQoKHNiL21zZCkqMTAwLDEpDQogIG51X3IgPC0gcm91bmQoKG51L21zZCkqMTAwLDEpDQogIGxjX3IgPC0gcm91bmQoKGxjL21zZCkqMTAwLDEpDQoNCiAgbXNkX3IgPC0gc2JfcitudV9yK2xjX3INCg0KICAjIHNlbGVjdCB3aGljaCB2YXJpYWJsZXMgdG8gb3V0cHV0DQogIG91dCA8LSBjKHNiX3IsbnVfcixsY19yLCBtc2Rfciwgcm91bmQocjIqMTAwLDEpKQ0KDQogIHJldHVybihvdXQpDQoNCn0NCmBgYA0KDQojIyBUZXN0IHN0YXRzIGZ1bmN0aW9ucyB1c2VkDQoNCmBgYHtyfQ0KcyA8LSBjKDQyMzEuOTcyLDM5MzUuNjA0LDM3NzkuNjUyLDM2MjcuNjg3LDMzNjMuNDk5LDMyMzAuNTY2LDI4NjguMTE0LDI4NjguODI3KQ0KbSA8LSBjKDQ5ODcuNjYsNTYzNi4wOSw0NzU0LjA2LDQxMTQuNTMsNDE0MS43MiwzNzA0LjA2LDUxNDIuMTksNDc2Mi4wMykNCg0KeCA8LSBnYXVjaFN0YXRzKHMsbSkNCg0KdGVtcERmIDwtIGRhdGEuZnJhbWUoc3RhdE5hbWU9YygiU0IiLCJOVSIsIkxDIiwicl9NU0QiLCJSMiIpLCBzdGF0VmFsdWU9eCkNCiMga2FibGUodGVtcERmLCBkaWdpdHM9IDIpDQp0ZW1wRGYyIDwtIGRhdGEuZnJhbWUoUHJlZGljdGVkPXMsIE9ic2VydmVkPW0pDQoNCnggPC0gdGVtcERmMiAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgJT4lIA0KICB0KCkgDQoNCmRmIDwtIGRhdGEuZnJhbWUoc3RhdCA9IHJvdy5uYW1lcyh4KSxzdGF0dmFsdWUgPSB4WywxXSkNCg0KZGYgJT4lDQogIGthYmxlKGZvcm1hdCA9ICJtYXJrZG93biIpDQpgYGANCg0KYGBge3J9DQpSb290LnJlc3AkVmFyaWFibGU8LSBmYWN0b3IoUm9vdC5yZXNwJFZhcmlhYmxlLCBsZXZlbHM9YygiUm1fcm9vdF9kYXkxIiwgIlJtX3Jvb3RfZGF5MiIsICJSbV9yb290X2RheTMiLCAiUm1fcm9vdF9kYXk0IiwgIlJtX3Jvb3RfZGF5NSIsIlJtX3Jvb3RfZGF5NiIsICJSbV9yb290X2RheTciLCJSbV9yb290X2RheTgiLCJSbV9yb290X2RheTkiLCJSbV9yb290X2RheTEwIikpDQpSb290LnJlc3AgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1GaW5pYWxSVyklPiUNCiAgICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IiklPiUNCiAgZ3JvdXBfYnkoVmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICByMiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVs1XSwNCiAgIyAgcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKSwwKSwNCiAgICByX3Jtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCkvbWVhbihPYnNlcnZlZCkqMTAwLDEpLA0KICAgIG5zZSA9IHJvdW5kKE5TRShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDEpLA0KICAgIHNiID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzFdLA0KICBudSA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsyXSwNCiAgbGMgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbM10NCiAgKSANCiMjIzE9MC4wMTMsMC4wMTUsIDAuMDIsIDAuMDI1LDAuMDI4LCAwLjAzLCAwLjAzNSwwLjA0LCgwLjA0NSksMC4wNQ0KDQpgYGANCg0KIyMjIGRhaWx5IHdpbnRlciByZXNwaXJhdGlvbiB3aXRoIHN0cnVjdHVyYWwgcm9vdCBiaW9tYXNzDQpgYGB7ciwsZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0NCnVwRGlyIDwtICJEOi9SLyINClJvb3RkZiA8LSAiRDovUi9SZXNwaXJhdGlvbi8iDQoNClJvb3RSZXNwPC0gcmVhZC50YWJsZShwYXN0ZTAoUm9vdGRmLCAiUm9vdFJlc3BTdHJ1LnR4dCIpLA0KICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNClJvb3QucmVzcC5zdHJ1IDwtIFJvb3RSZXNwICU+JSBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgZmlsdGVyKEZpbmlhbFJXIT0iTkEiKSU+JQ0KICBkcGx5cjo6c2VsZWN0KE5hbWUsQ2xvY2suVG9kYXksVGVhcnRoLEdyb3d0aFJvdGF0aW9uLEZpbmlhbFJXLFJtX3Jvb3RfZGF5MSxSbV9yb290X2RheTIsUm1fcm9vdF9kYXkzLCBSbV9yb290X2RheTQsIFJtX3Jvb3RfZGF5NSxSbV9yb290X2RheTYsUm1fcm9vdF9kYXk3LFJtX3Jvb3RfZGF5OCxSbV9yb290X2RheTksUm1fcm9vdF9kYXkxMCxSbV9yb290X2RheTExLFJtX3Jvb3RfZGF5MTIsUm1fcm9vdF9kYXkxMyxSbV9yb290X2RheTE0LFJtX3Jvb3RfZGF5MTUsUm1fcm9vdF9kYXkxNixSbV9yb290X2RheTE3LFJtX3Jvb3RfZGF5MTgsUm1fcm9vdF9kYXkxOSxSbV9yb290X2RheTIwKSAlPiUNCiAgdGlkeXI6OmdhdGhlcigiVmFyaWFibGUiLCJQcmVkaWN0ZWQiLFJtX3Jvb3RfZGF5MTpSbV9yb290X2RheTIwKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCg0KUm9vdC5yZXNwLnN0cnUkVmFyaWFibGU8LSBmYWN0b3IoUm9vdC5yZXNwLnN0cnUkVmFyaWFibGUsIGxldmVscz1jKCJSbV9yb290X2RheTEiLCAiUm1fcm9vdF9kYXkyIiwgIlJtX3Jvb3RfZGF5MyIsICJSbV9yb290X2RheTQiLCAiUm1fcm9vdF9kYXk1IiwiUm1fcm9vdF9kYXk2IiwgIlJtX3Jvb3RfZGF5NyIsIlJtX3Jvb3RfZGF5OCIsIlJtX3Jvb3RfZGF5OSIsIlJtX3Jvb3RfZGF5MTAiLCJSbV9yb290X2RheTExIiwiUm1fcm9vdF9kYXkxMiIsIlJtX3Jvb3RfZGF5MTMiLCJSbV9yb290X2RheTE0IiwiUm1fcm9vdF9kYXkxNSIsIlJtX3Jvb3RfZGF5MTYiLCJSbV9yb290X2RheTE3IiwiUm1fcm9vdF9kYXkxOCIsIlJtX3Jvb3RfZGF5MTkiLCJSbV9yb290X2RheTIwIikpDQpSb290LnJlc3Auc3RydSU+JQ0KICBnZ3Bsb3QoYWVzKHg9RmluaWFsUlcsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoTmFtZSkpKSArDQogIGdlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxKSArDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMSkrDQogIGdndGl0bGUoIlJvb3QgYmlvbWFzcyIpKw0KICBmYWNldF93cmFwKH5WYXJpYWJsZSwgbmNvbCA9IDUpKw0KICB0aGVtZV9idygpK215dGhlbWUzKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLDgwMDAsIGJ5ID0zMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCwgNjAwMCwgYnkgPTIwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgeWxhYigiUHJlZGljdGVkIikreGxhYigiT2JzZXJ2ZWQiKStnZ3RpdGxlKCJSZXNwaXJhdGlvbiBpbiBXaW50ZXIiKSsgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SbV9yb290X2RheVN0cnUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTEwLCBkcGk9NTAwKQ0KYGBgDQojIyNhbmFseXNpcw0KYGBge3J9DQpSb290LnJlc3Auc3RydSRWYXJpYWJsZTwtIGZhY3RvcihSb290LnJlc3Auc3RydSRWYXJpYWJsZSwgbGV2ZWxzPWMoIlJtX3Jvb3RfZGF5MSIsICJSbV9yb290X2RheTIiLCAiUm1fcm9vdF9kYXkzIiwgIlJtX3Jvb3RfZGF5NCIsICJSbV9yb290X2RheTUiLCJSbV9yb290X2RheTYiLCAiUm1fcm9vdF9kYXk3IiwiUm1fcm9vdF9kYXk4IiwiUm1fcm9vdF9kYXk5IiwiUm1fcm9vdF9kYXkxMCIsIlJtX3Jvb3RfZGF5MTEiLCJSbV9yb290X2RheTEyIiwiUm1fcm9vdF9kYXkxMyIsIlJtX3Jvb3RfZGF5MTQiLCJSbV9yb290X2RheTE1IiwiUm1fcm9vdF9kYXkxNiIsIlJtX3Jvb3RfZGF5MTciLCJSbV9yb290X2RheTE4IiwiUm1fcm9vdF9kYXkxOSIsIlJtX3Jvb3RfZGF5MjAiKSkNClJvb3QucmVzcC5zdHJ1ICU+JQ0KICBtdXRhdGUoT2JzZXJ2ZWQ9RmluaWFsUlcpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuMDEzLDAuMDE4LCAwLjAyLCAwLjAyNSwgMC4wMywgMC4wMzUsIDAuMDQsIDAuMDQ1LCAwLjA1LCAwLjA1NSwgMC4wNiwgMC4wNjUsIDAuMDcsIDAuMDc1LCAwLjA4LCAoMC4wODUpLDAuMDksMC4wOTUsMC4xLCAwLjE1Lg0KDQpgYGANCg0KDQojIyNOZXcgYW5hbmx5c2lzDQojIyNJbnRlcnB1b2xhdGUgUEFSaQ0KIyMjbG9hZCBkYXRhDQpgYGB7cn0NCg0KdXBEaXIgPC0gIkQ6L1IvQ29tYmluZWREYXRhLyINCm9ic0RhdGEgPC0gIkQ6L1IvQ29tYmluZWREYXRhLyINCg0KUm9vdG1ldCA8LSByZWFkLnRhYmxlKHBhc3RlMChvYnNEYXRhLCAiUm9vdE1ldC50eHQiKSwNCiAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUNCiAgZHBseXI6OmZpbHRlcihFeHBOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTFNHc18xUnRfOCIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRXhwTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25MTEZERkQ1R3NfM1J0XzYiKQ0KDQpgYGANCiMjI0ludGVycG9sdWF0ZQ0KIyMjSW50ZXJwb2xhdGUgdGVtcGVyYXR1cmUgZmFjdG9yIA0KDQpgYGB7cn0NCg0KIyBDcmVhdGUgYSBUVCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbg0KDQojIEFpbTogSW50ZXJwb2xhdGVzIGxpbmVhcmx5IGJldHdlZW4gdHdvIGtub3duIHgteSBwYWlycw0KDQppbnRfZnVuYyA8LSBmdW5jdGlvbih0ZW1wLFRULHRlbXBfcmVmKXsNCg0KIyBpZiB0ZW1wIGlzIHRvbyBsb3cgb3IgdG9vIGhpZ2ggZ2l2ZSBleHRyZW1lIFRUIHZhbHVlcw0KIGlmKHRlbXBfcmVmPnRlbXBbbGVuZ3RoKHRlbXApXSkgew0KICAgDQogICBvdXQgPC0gVFRbbGVuZ3RoKFRUKV0gDQogICANCiB9IGVsc2UgaWYgKHRlbXBfcmVmPHRlbXBbMV0pIHsNCiAgIA0KICAgb3V0IDwtIFRUWzFdDQogICANCiB9IGVsc2Ugew0KICAgDQojIGVsc2UgaW50ZXJwb2xhdGUNCiAgIA0KICAgdHJ5Q2F0Y2goICANCiAgIA0KICBvdXQgPC0gYXBwcm94KHRlbXAsIFRULCB4b3V0ID0gdGVtcF9yZWYsIA0KICAgICAgICAgbWV0aG9kPSJsaW5lYXIiLCANCiAgICAgICAgIHJ1bGUgPSAyKSR5LA0KICBlcnJvciA9IGZ1bmN0aW9uKGUpIA0KICB7DQogIG91dCA8LSBOQQ0KICB9DQopIA0KICANCn0gIyBlbmQgaWYgY2hlY2sNCg0KICByZXR1cm4ob3V0KSAgDQogIA0KIH0NCiAgDQoNCiMgVGVzdCBhbmQgdGVzdCBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIA0KDQojIFNldCBhbiBpbnB1dCBjYXJkaW5hbCB0ZW1wZXJhdHVyZSBkZg0KdHRfY2FyZCA8LSBkYXRhLmZyYW1lKHhfcmVmPWMoMS4wLCAgNS4wLCAgMTAsICAxNSwgIDMwLCAgNDApLA0KICAgICAgICAgICAgICAgICAgICAgIHlfcmVmPWMoMC4wLCAgMy4wLCAgNi41LCAxMCwgIDI1LCAgMC4wKSkNCg0KdGVtcF9yZWYgIDwtIDI1ICMgcmFuZG9tIGlucHV0IHgtYXhlcyB2YWx1ZSB0byB0ZXN0DQp0ZW1wIDwtIHR0X2NhcmQkeF9yZWYgIyB4LWF4ZXMNClRUIDwtIHR0X2NhcmQkeV9yZWYgIyB5LWF4ZXMNCg0KaW50X2Z1bmModGVtcCxUVCx0ZW1wX3JlZikgIyByZXN1bHQgbXVzdCBiZSAyMA0KYGBgDQojIyMgaW50ZXJwb2x1YXRlIGFzIHggYW5kIHkgcGFpcnMNCg0KYGBge3J9DQoNCnRfZmFjdG9yIDwtIGRhdGEuZnJhbWUoeF9yZWY9YygwLjAsIDE4LCAgMzAsICA0MCksDQogICAgICAgICAgICAgICAgICAgICAgICB5X3JlZj1jKDAuMCwgMS4wLCAgMS4wLCAgMC4wKSkNCiAgDQogIA0KVGVtLmZhY3RvcjwtUm9vdG1ldCAlPiUNCiAgbXV0YXRlKFQuZmFjdG9yPWludF9mdW5jKHRfZmFjdG9yJHhfcmVmLHRfZmFjdG9yJHlfcmVmLCBtZWFuKSklPiUNCiAgI211dGF0ZShwb3RlbnRpYWxQcm9kdWN0aW9uPVBBUmkqMTYuMipULmZhY3RvciklPiUgICAgICMjI1JVRSA9MS42Mg0KICBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgbXV0YXRlKEV4cFVuaXRDb2RlPWFzLmZhY3RvcihFeHBOYW1lKSkNCiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANClRlbS5mYWN0b3IgIA0Kd3JpdGUuY3N2KFRlbS5mYWN0b3IgLCJEOi9SL1Jlc3BpcmF0aW9uL1RlbS5mYWN0b3IuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCmBgYA0KDQoNCg0KIyMjZlBBUiBpbnRlcnBvbGF0ZSBmb3IgZWFjaCByb3RhdGlvbg0KIyMjI1JVRSB0ZXN0aW5nDQpgYGB7cn0NCg0KVW5pRXhwIDwtIHVuaXF1ZShUZW0uZmFjdG9yJEV4cE5hbWUpDQoNCmZQQVIuZGYgPC0gZGF0YS5mcmFtZSgpDQogIA0KZm9yKGkgaW4gMTpsZW5ndGgoVW5pRXhwKSkNCnsNCiAgDQogUm9vdG1ldGZQQVI8LVRlbS5mYWN0b3IgJT4lDQogICBmaWx0ZXIoRXhwTmFtZT09VW5pRXhwW2ldKSU+JQ0KICBtdXRhdGUoVHRfYnJva2VuX3N1bT1hcy5udW1lcmljKFR0X2Jyb2tlbl9zdW0pKQ0KICANCiBmUEFSLmRhdGE8LVJvb3RtZXRmUEFSJT4lDQogIG11dGF0ZShmUEFSPWFwcHJveChUdF9icm9rZW5fc3VtLCBGcmFuY3Rpb24sIHhvdXQgPVR0X2Jyb2tlbl9zdW0sIA0KICAgICAgICAgbWV0aG9kPSJsaW5lYXIiLCANCiAgICAgICAgIHJ1bGUgPSAyKSR5KSU+JSAgICAgIyNpbnRlcnBvbGF0ZSBmdW5jdGlvbiANCiBtdXRhdGUoUEFSaT1yYWRuKmZQQVIpJT4lIA0KICAgIHVuaXF1ZSgpJT4lDQogICAgICMjYWNjbXVsYXRlZCBmdW5jdGlvbg0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTAgPSBQQVJpKjcuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC43MmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0wID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5MCkpJT4lDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5MSA9IFBBUmkqNy43KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAwLjc3Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTEgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXkxKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkyID0gUEFSaSo4LjIqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuODJnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtMiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTIpKSU+JQ0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTMgPSBQQVJpKjguNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC44N2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0zID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5MykpJT4lDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5M0EgPSBQQVJpKjguOCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC44OGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0zQSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTNBKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5M0IgPSBQQVJpKjguOSpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC44OWcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0zQiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTNCKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTNDID0gUEFSaSo5LjAqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuOTBnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtM0MgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXkzQykpJT4lICAgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTNEID0gUEFSaSo5LjEqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuOTFnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtM0QgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXkzRCkpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTQgPSBQQVJpKjkuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC45MmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW00ID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5NCkpJT4lDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NEEgPSBQQVJpKjkuMypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC45M2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW00QSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTRBKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NEIgPSBQQVJpKjkuNCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC45NGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW00QiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTRCKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTRDID0gUEFSaSo5LjUqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuOTVnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtNEMgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk0QykpJT4lICANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk0RCA9IFBBUmkqOS42KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAwLjk2Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTREID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5NEQpKSU+JSAgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NSA9IFBBUmkqOS43KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAwLjk3Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTUgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk1KSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk2ID0gUEFSaSoxMC4yKlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjAyZy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTYgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk2KSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NyA9IFBBUmkqMTAuNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4wN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW03ID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5NykpJT4lICANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk3QSA9IFBBUmkqMTAuOCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4wOGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW03QSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTdBKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTdCID0gUEFSaSoxMC45KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjA5Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTdCID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5N0IpKSU+JSANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk3QyA9IFBBUmkqMTEuMCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xMGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW03QyA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTdDKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5N0QgPSBQQVJpKjExLjEqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMTFnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtN0QgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk3RCkpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTggPSBQQVJpKjExLjIqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjEyZy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTggPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk4KSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk4QSA9IFBBUmkqMTEuMypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xM2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW04QSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheThBKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheThCID0gUEFSaSoxMS40KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjE0Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bThCID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5OEIpKSU+JSANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk4QyA9IFBBUmkqMTEuNSpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xNWcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW04QyA9IGN1bXN1bShQcm9kdWN0aW9uLmRheThDKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5OEQgPSBQQVJpKjExLjYqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMTZnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtOEQgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk4RCkpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTkgID0gUEFSaSoxMS43KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW05ICA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTkpKSU+JSAgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5OUEgPSBQQVJpKjExLjgqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMThnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtOUEgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk5QSkpJT4lICANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk5QiA9IFBBUmkqMTEuOSpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xOWcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW05QiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTlCKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5OUMgPSBQQVJpKjEyLjAqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMjBnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtOUMgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk5QykpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTlEID0gUEFSaSoxMi4xKlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjIxZy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTlEID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5OUQpKSU+JSANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMCA9IFBBUmkqMTIuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4yMmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMCA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTEwKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMSA9IFBBUmkqMTIuNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4yN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTExKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMiA9IFBBUmkqMTMuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4zMmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTEyKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMyA9IFBBUmkqMTMuNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4zN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMyA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTEzKSklPiUNCiBtdXRhdGUoUG90ZW50aWFscm9vdDEgPSBQQVJpKjEqVC5mYWN0b3IpJT4lDQogbXV0YXRlKFN1bXBvdGVudGlhbDEgPSBjdW1zdW0oUG90ZW50aWFscm9vdDEpKSU+JSAgICAgICAgICAgIyMjUnVFIHJvb3QgaXMgMC4xZy9NSg0KIG11dGF0ZShQb3RlbnRpYWxyb290MiA9IFBBUmkqMipULmZhY3RvciklPiUNCiBtdXRhdGUoU3VtcG90ZW50aWFsMiA9IGN1bXN1bShQb3RlbnRpYWxyb290MikpJT4lICAgICAgICAgICAjIyMjUlVFIHJvb3QgaXMgMC4yZy9NSg0KIG11dGF0ZShQb3RlbnRpYWxyb290MyA9IFBBUmkqMi40KlQuZmFjdG9yKSU+JQ0KIG11dGF0ZShTdW1wb3RlbnRpYWwzID0gY3Vtc3VtKFBvdGVudGlhbHJvb3QzKSklPiUgICAgICAgICAgICMjIyNSVUUgcm9vdCBpcyAwLjI1Zy9NSg0KIG11dGF0ZShQb3RlbnRpYWxyb290M0EgPSBQQVJpKjIuNSpULmZhY3RvciklPiUNCiBtdXRhdGUoU3VtcG90ZW50aWFsM0EgPSBjdW1zdW0oUG90ZW50aWFscm9vdDNBKSklPiUgDQogbXV0YXRlKFBvdGVudGlhbHJvb3Q0ID0gUEFSaSozKlQuZmFjdG9yKSU+JQ0KIG11dGF0ZShTdW1wb3RlbnRpYWw0ID0gY3Vtc3VtKFBvdGVudGlhbHJvb3Q0KSklPiUgICAgICAgICAgICMjIyNSVUUgcm9vdCBpcyAwLjNnL01KDQogbXV0YXRlKFBvdGVudGlhbHJvb3Q1ID0gUEFSaSozLjUqVC5mYWN0b3IpJT4lDQogbXV0YXRlKFN1bXBvdGVudGlhbDUgPSBjdW1zdW0oUG90ZW50aWFscm9vdDUpKSU+JSAgICAgICAgICAgIyMjI1JVRSByb290IGlzIDAuMzVnL01KDQogbXV0YXRlKFBvdGVudGlhbHJvb3Q2ID0gUEFSaSo0KlQuZmFjdG9yKSU+JQ0KIG11dGF0ZShTdW1wb3RlbnRpYWw2ID0gY3Vtc3VtKFBvdGVudGlhbHJvb3Q2KSklPiUgICAgICAgICAgICMjIyNSVUUgcm9vdCBpcyAwLjRnL01KDQogbXV0YXRlKEFjY1BBUmk9Y3Vtc3VtKFBBUmkpKQ0KDQogZlBBUi5kZjwtIHJiaW5kKCBmUEFSLmRmLCBmUEFSLmRhdGEpDQoNCn0NCg0Kc3VtbWFyeShmUEFSLmRmKQ0KZlBBUi5kZg0Kd3JpdGUuY3N2KGZQQVIuZGYsIkQ6L1IvZlBBUm9vdDEuZGYuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KIyMjY2FsY3VsYXRlZCBwcm90ZW50aWFsIHlpZWxkIGFuZCByZW1vYmxpc2F0aW9uDQojIyNtZXJnZSBQQVJpIGFuZCBvYnNlcnZlZCBkYXRhDQpgYGB7cn0NCkUzSUxMUzE8LUUzSUxMJT4lDQogIGZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksRXhwTmFtZSxJbnRlcnZhbCwgVmFyaWFibGVVbml0cyxPYnNlcnZlZCxTdGRERVYsRXhwZXJpbWVudElELFRyZWF0bWVudElELElELEdyb3d0aFNlYXNvbjEsDQpSb3RhdGlvbjEsIENsb2NrLlRvZGF5MSxHcm93dGhTZWFzb24yLEdyb3d0aFJvdGF0aW9uKSU+JQ0KICBtdXRhdGUoc2hvb3RiaW9tYXNzPU9ic2VydmVkLFN0ZERFVlM9U3RkREVWKQ0KICANCg0KRTNJTExSMTwtRTNJTEwlPiUNCiAgZmlsdGVyKFRiYj09MSklPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0iUm9vdFd0IiklPiUNCiAgZHBseXI6OnNlbGVjdChDbG9jay5Ub2RheSxFeHBOYW1lLE9ic2VydmVkLFN0ZERFViklPiUNCiAgbXV0YXRlKFJvb3RXdD1PYnNlcnZlZCxTdGRERVZSPVN0ZERFVikNCg0KRTNJTEwxPC1tZXJnZShFM0lMTFMxLEUzSUxMUjEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBOYW1lIikpJT4lDQogIGRwbHlyOjpzZWxlY3QoLU9ic2VydmVkLngsLVN0ZERFVi54LC1PYnNlcnZlZC55LCAtU3RkREVWLnkpDQogIA0KDQoNClAuRTNJTEw8LW1lcmdlKFRlbS5mYWN0b3IsRTNJTExTMSxieT1jKCJDbG9jay5Ub2RheSIsIkV4cE5hbWUiKSklPiUNCiAgdW5pcXVlKCkNCndyaXRlLmNzdihQLkUzSUxMLCJEOi9SL1Jlc3BpcmF0aW9uL1AuRTNJTEwuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCmBgYA0KIyMjcGxvdCBwb3RlbnRhaWwgYW5kIHNob290IGJpb21hc3MNCmBgYHtyfQ0KZlBBUi5kZiU+JQ0KICBkcGx5cjo6ZmlsdGVyKElEPT0iRTNJTEwiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9cHJvZHVjdGlvbi5zdW0yKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiBnZW9tX3BvaW50KGRhdGE9RTNJTExTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAjI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyfQ0KRTNJTFNTMTwtRTNJTFMlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkUzSUxTPC1tZXJnZShmUEFSLmRmLEUzSUxTUzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFM0lMUyIpJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1wcm9kdWN0aW9uLnN1bTIpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGRhdGE9RTNJTFNTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAgI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KDQoNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQpgYGB7cn0NCkUzSVNMUzE8LUUzSVNMJT4lDQogICNmaWx0ZXIoVGJiPT0xKSU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KICBkcGx5cjo6c2VsZWN0KENsb2NrLlRvZGF5LCBFeHBVbml0Q29kZSxWYXJpYWJsZVVuaXRzLE9ic2VydmVkLFZhcmlhYmxlLFN0ZERFVixFeHBlcmltZW50SUQsSUQsR3Jvd3RoU2Vhc29uMSwNClJvdGF0aW9uMSwgQ2xvY2suVG9kYXkxLEdyb3d0aFNlYXNvbjIpJT4lDQogIG11dGF0ZShzaG9vdGJpb21hc3M9T2JzZXJ2ZWQsU3RkREVWUz1TdGRERVYpDQoNCg0KUC5FM0lTTDwtbWVyZ2UoZlBBUi5kZixFM0lTTFMxLGJ5PWMoIkNsb2NrLlRvZGF5IiwiRXhwVW5pdENvZGUiKSkNCg0KZlBBUi5kZiU+JQ0KICBkcGx5cjo6ZmlsdGVyKElEPT0iRTNJU0wiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9cHJvZHVjdGlvbi5zdW0yKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChkYXRhPUUzSVNMUzEsYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MsY29sb3I9InJlZCIsc2l6ZT0yKSkrDQogICNmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrbXl0aGVtZTMrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCg0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyfQ0KRTNJU1NTMTwtRTNJU1MlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkUzSVNTPC1tZXJnZShmUEFSLmRmLEUzSVNTUzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFM0lTUyIpJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1wcm9kdWN0aW9uLnN1bTIpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGRhdGE9RTNJU1NTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAgI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KDQp3cml0ZS5jc3YoUC5FM0lTUywiRDovUi9SZXNwaXJhdGlvbi9QLkUzSVNTLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyfQ0KRTVJSEhGNVMxPC1FNUlISEZENSU+JQ0KICAjZmlsdGVyKFRiYj09MSklPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0ic2hvb3RiaW9tYXNzIiklPiUNCiAgZHBseXI6OnNlbGVjdChDbG9jay5Ub2RheSwgRXhwVW5pdENvZGUsVmFyaWFibGVVbml0cyxPYnNlcnZlZCxWYXJpYWJsZSxTdGRERVYsRXhwZXJpbWVudElELElELEdyb3d0aFNlYXNvbjEsDQpSb3RhdGlvbjEsIENsb2NrLlRvZGF5MSxHcm93dGhTZWFzb24yKSU+JQ0KICBtdXRhdGUoc2hvb3RiaW9tYXNzPU9ic2VydmVkLFN0ZERFVlM9U3RkREVWKQ0KDQoNClAuRTVJSEhGNTwtbWVyZ2UoZlBBUi5kZixFNUlISEY1UzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFNUlISEY1IiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXByb2R1Y3Rpb24uc3VtMikpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoZGF0YT1FNUlISEY1UzEsYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MsY29sb3I9InJlZCIsc2l6ZT0yKSkrDQogICNmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrbXl0aGVtZTMrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQpgYGB7cn0NCkU1SVNTRjVTMTwtRTVJU1NGRDUlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkU1SVNTRjVTMTwtbWVyZ2UoZlBBUi5kZixFNUlTU0Y1UzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFNUlTU0Y1IiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXByb2R1Y3Rpb24uc3VtMikpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoZGF0YT1FNUlTU0Y1UzEsYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MsY29sb3I9InJlZCIsc2l6ZT0yKSkrDQogICNmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrbXl0aGVtZTMrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpFNUlMTEY1UzE8LUU1SUxMRjUlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkU1SUxMRjVTMTwtbWVyZ2UoZlBBUi5kZixFNUlMTEY1UzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQoNCmZQQVIuZGYlPiUNCiAgZHBseXI6OmZpbHRlcihJRD09IkU1SUxMRjUiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9cHJvZHVjdGlvbi5zdW0yKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChkYXRhPUU1SUxMRjVTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAgI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgDQojIyNMb2FkIGRhdGEgDQojIyNhbmFseXNpcyBvZiBwcm9kdWN0aW9uDQpgYGB7cn0NCnVwRGlyIDwtICJEOi9SL1Jlc3BpcmF0aW9uLyINCm9ic0RhdGEgPC0gIkQ6L1IvUmVzcGlyYXRpb24vIg0KQmlvbWFzcyA8LSByZWFkLmNzdihwYXN0ZTAob2JzRGF0YSwgImZQQVJvb3QuZGYuQ1NWIiksDQogICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lDQogIG11dGF0ZShDbG9jay5Ub2RheT1kbXkoQ2xvY2suVG9kYXkpKQ0KDQpCaW9tYXNzLkxMPC1CaW9tYXNzJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjUm9vdCBiaW9tYXNzIGp1c3QgZnJvbSByZXNwaXJhdGlvbiAwLjAzDQogIGZpbHRlcihJRD09IkUzSUxMIiklPiUNCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpDQoNCkJpb21hc3MuTEwlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RSZXNwaXJhdGlvbjEpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3BvaW50KGFlcyh5PVJvb3RXdCxzaXplPTIpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFJlc3BpcmF0aW9uMikpK2dndGl0bGUocGFzdGUwKCJFM0lMTCIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiUm9vdCBiaW9tYXNzIChrZy9oYSkiKSt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQoNCg0KYGBgDQojIyMjI1Jvb3QgZ3Jvd3RoIFJhdGUgY2FsY3VsYXRpb24NCiMjI3Bsb3QgcG90ZW50aWFsIHJvb3QgYmlvbWFzcyBhZ2FuaXN0IGFjY3VtbGF0ZWQgVHQgKGxpbmVhciByZWdyZXNzaW9uIGFuYWx5c2lzKQ0KIyMjI2NhbGN1bGF0ZSByb290IGdyb3d0aCByYXRlDQpgYGB7cixoZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQoNCkJpb21hc3MxPC1CaW9tYXNzJT4lDQogIG11dGF0ZShQVD1UdF9maWNrX3N1bS9QcCklPiUNCiAgbXV0YXRlKHBlcj1QYXJ0aXRpb25pbmcvcHJvZHVjdGlvbi5zdW0pJT4lDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFMyIpJT4lDQogIGZpbHRlcihQYXJ0aXRpb25pbmchPSJOQSIpDQoNCkJpb21hc3MxJT4lDQogICNmaWx0ZXIoSUQ9PSJFM0lMTCIpJT4lDQogIGdncGxvdChhZXMoeD1UdF9icm9rZW5fc3VtLCB5PVBhcnRpdGlvbmluZyxjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0xKSsNCiAgZmFjZXRfZ3JpZChHcm93dGhTZWFzb25+Um90YXRpb24pICsgdGhlbWVfYncoKStteXRoZW1lMyt4bGFiKCJUaGVybWFsIHRpbWUiKSt5bGFiKCJQb3RlbnRpYWwgcm9vdCBzdG9yYWdlIikNCiAgICNnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpIA0KICAjZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RSZXNwaXJhdGlvbjIpKQ0KDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvcm9vdHN0b3JhZ2UucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KIyMjI0luY3JlYXNpbmcgUHANCiMjI1JVRSB0ZXN0aW5nDQoNCmBgYHtyLHdpZHRoPTgsIGhlaWdodD02fQ0KDQpCaW9tYXNzSW5jIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJJbmMiKSU+JQ0KICBmaWx0ZXIoZlBBUiE9MCklPiUNCiAgZHBseXI6OnNlbGVjdChFeHBlcmltZW50SUQsVHJlYXRtZW50SUQsSUQsQ2xvY2suVG9kYXksVGVhcnRoLFRyZW5kLFN0YWdlLEdyb3d0aFJvdGF0aW9uLHNob290YmlvbWFzcyxTdFMsUHJvZHVjdGlvbi5zdW0wLFByb2R1Y3Rpb24uc3VtMSxQcm9kdWN0aW9uLnN1bTIsUHJvZHVjdGlvbi5zdW0zLFByb2R1Y3Rpb24uc3VtM0EsUHJvZHVjdGlvbi5zdW0zQixQcm9kdWN0aW9uLnN1bTNDLFByb2R1Y3Rpb24uc3VtM0QsUHJvZHVjdGlvbi5zdW00LFByb2R1Y3Rpb24uc3VtNEEsUHJvZHVjdGlvbi5zdW00QixQcm9kdWN0aW9uLnN1bTRDLFByb2R1Y3Rpb24uc3VtNEQsUHJvZHVjdGlvbi5zdW01LFByb2R1Y3Rpb24uc3VtNixQcm9kdWN0aW9uLnN1bTcsUHJvZHVjdGlvbi5zdW03QSxQcm9kdWN0aW9uLnN1bTdCLFByb2R1Y3Rpb24uc3VtN0MsUHJvZHVjdGlvbi5zdW03RCxQcm9kdWN0aW9uLnN1bTgsUHJvZHVjdGlvbi5zdW04QSxQcm9kdWN0aW9uLnN1bThCLFByb2R1Y3Rpb24uc3VtOEMsUHJvZHVjdGlvbi5zdW04RCxQcm9kdWN0aW9uLnN1bTksUHJvZHVjdGlvbi5zdW05QSxQcm9kdWN0aW9uLnN1bTlCLFByb2R1Y3Rpb24uc3VtOUMsUHJvZHVjdGlvbi5zdW05RCxQcm9kdWN0aW9uLnN1bTEwLFByb2R1Y3Rpb24uc3VtMTEsUHJvZHVjdGlvbi5zdW0xMixQcm9kdWN0aW9uLnN1bTEzKSAlPiUNCiAgdGlkeXI6OmdhdGhlcigiVmFyaWFibGUiLCJQcmVkaWN0ZWQiLFByb2R1Y3Rpb24uc3VtMzpQcm9kdWN0aW9uLnN1bTEwKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCkJpb21hc3NJbmMgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc0luYyRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb2R1Y3Rpb24uc3VtMCIsIlByb2R1Y3Rpb24uc3VtMSIsIlByb2R1Y3Rpb24uc3VtMiIsIlByb2R1Y3Rpb24uc3VtMyIsIlByb2R1Y3Rpb24uc3VtM0EiLCJQcm9kdWN0aW9uLnN1bTNCIiwiUHJvZHVjdGlvbi5zdW0zQyIsIlByb2R1Y3Rpb24uc3VtM0QiLCJQcm9kdWN0aW9uLnN1bTQiLCJQcm9kdWN0aW9uLnN1bTRBIiwiUHJvZHVjdGlvbi5zdW00QiIsIlByb2R1Y3Rpb24uc3VtNEMiLCJQcm9kdWN0aW9uLnN1bTREIiwiUHJvZHVjdGlvbi5zdW01IiwiUHJvZHVjdGlvbi5zdW02IiwiUHJvZHVjdGlvbi5zdW03IiwiUHJvZHVjdGlvbi5zdW03QSIsIlByb2R1Y3Rpb24uc3VtN0IiLCJQcm9kdWN0aW9uLnN1bTdDIiwiUHJvZHVjdGlvbi5zdW03RCIsIlByb2R1Y3Rpb24uc3VtOCIsIlByb2R1Y3Rpb24uc3VtOEEiLCJQcm9kdWN0aW9uLnN1bThCIiwiUHJvZHVjdGlvbi5zdW04QyIsIlByb2R1Y3Rpb24uc3VtOEQiLCJQcm9kdWN0aW9uLnN1bTkiLCJQcm9kdWN0aW9uLnN1bTlBIiwiUHJvZHVjdGlvbi5zdW05QiIsIlByb2R1Y3Rpb24uc3VtOUMiLCJQcm9kdWN0aW9uLnN1bTlEIiwiUHJvZHVjdGlvbi5zdW0xMCIsIlByb2R1Y3Rpb24uc3VtMTEiLCJQcm9kdWN0aW9uLnN1bTEyIiwiUHJvZHVjdGlvbi5zdW0xMyIpKQ0KDQpCaW9tYXNzSW5jJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChJbmMpIikrDQogIGZhY2V0X3dyYXAoflZhcmlhYmxlLCBuY29sID0gNikrDQogIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsODAwMCwgYnkgPTMwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLCA2MDAwLCBieSA9MjAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICB5bGFiKCJQcmVkaWN0ZWQiKSt4bGFiKCJPYnNlcnZlZCIpICt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRXNob290SW5jLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KIA0KYGBgDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCkJpb21hc3NTaG9vdEUzMTwtQmlvbWFzc0luYyU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJQcm9kdWN0aW9uLnN1bTkiKQ0KQmlvbWFzc1Nob290RTMxJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5JRCxuY29sID0gMSkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXksIHk9UHJlZGljdGVkKSxjb2xvdXI9ImdyZWVuIixzaXplPTMpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKGJxdW90ZShib2xkKCdTaG9vdCBETSAoJyprZ35oYV4tMSonKScpKSkrDQogbXl0aGVtZTMNCmBgYA0KDQoNCmBgYHtyfQ0KDQpCaW9tYXNzSW5jICU+JQ0KICBtdXRhdGUoT2JzZXJ2ZWQ9c2hvb3RiaW9tYXNzKSU+JQ0KICBncm91cF9ieShWYXJpYWJsZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuID0gbigpLA0KICAgIHIyID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzVdLA0KICAjICBybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDApLA0KICAgIHJfcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKS9tZWFuKE9ic2VydmVkKSoxMDAsMSksDQogICAgbnNlID0gcm91bmQoTlNFKFByZWRpY3RlZCxPYnNlcnZlZCksMSksDQogICAgc2IgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMV0sDQogIG51ID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzJdLA0KICBsYyA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVszXQ0KICApIA0KIyMjMT0wLjcyLCAwLjc3LCAwLjgyLCAwLjg3LCAwLjkyLCAwLjk3LCAxLjAyLCAxLjA3LCAxLjEyLCAoMS4xNyksIDEuMjIsIDEuMjcsIDEuMzIsMS4zNywgMS40MiwgMS41MiwgMS42MiwgMS43Mg0KDQpgYGANCg0KIyMjI0RlYyBQcA0KYGBge3Isd2lkdGg9OCwgaGVpZ2h0PTh9DQpCaW9tYXNzRGVjIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJEZWMiKSU+JQ0KICBmaWx0ZXIoZlBBUiE9MCklPiUNCiAgZHBseXI6OnNlbGVjdChFeHBlcmltZW50SUQsVHJlYXRtZW50SUQsSUQsQ2xvY2suVG9kYXksVGVhcnRoLFRyZW5kLFN0YWdlLEdyb3d0aFJvdGF0aW9uLHNob290YmlvbWFzcyxTdFMsUHJvZHVjdGlvbi5zdW0wLFByb2R1Y3Rpb24uc3VtMSxQcm9kdWN0aW9uLnN1bTIsUHJvZHVjdGlvbi5zdW0zLFByb2R1Y3Rpb24uc3VtM0EsUHJvZHVjdGlvbi5zdW0zQixQcm9kdWN0aW9uLnN1bTNDLFByb2R1Y3Rpb24uc3VtM0QsUHJvZHVjdGlvbi5zdW00LFByb2R1Y3Rpb24uc3VtNEEsUHJvZHVjdGlvbi5zdW00QixQcm9kdWN0aW9uLnN1bTRDLFByb2R1Y3Rpb24uc3VtNEQsUHJvZHVjdGlvbi5zdW01LFByb2R1Y3Rpb24uc3VtNixQcm9kdWN0aW9uLnN1bTcsUHJvZHVjdGlvbi5zdW03QSxQcm9kdWN0aW9uLnN1bTdCLFByb2R1Y3Rpb24uc3VtN0MsUHJvZHVjdGlvbi5zdW03RCxQcm9kdWN0aW9uLnN1bTgsUHJvZHVjdGlvbi5zdW04QSxQcm9kdWN0aW9uLnN1bThCLFByb2R1Y3Rpb24uc3VtOEMsUHJvZHVjdGlvbi5zdW04RCxQcm9kdWN0aW9uLnN1bTksUHJvZHVjdGlvbi5zdW05QSxQcm9kdWN0aW9uLnN1bTlCLFByb2R1Y3Rpb24uc3VtOUMsUHJvZHVjdGlvbi5zdW05RCxQcm9kdWN0aW9uLnN1bTEwLFByb2R1Y3Rpb24uc3VtMTEsUHJvZHVjdGlvbi5zdW0xMixQcm9kdWN0aW9uLnN1bTEzKSAlPiUNCiAgdGlkeXI6OmdhdGhlcigiVmFyaWFibGUiLCJQcmVkaWN0ZWQiLFByb2R1Y3Rpb24uc3VtMzpQcm9kdWN0aW9uLnN1bTEwKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCkJpb21hc3NEZWMgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc0RlYyRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb2R1Y3Rpb24uc3VtMCIsIlByb2R1Y3Rpb24uc3VtMSIsIlByb2R1Y3Rpb24uc3VtMiIsIlByb2R1Y3Rpb24uc3VtMyIsIlByb2R1Y3Rpb24uc3VtM0EiLCJQcm9kdWN0aW9uLnN1bTNCIiwiUHJvZHVjdGlvbi5zdW0zQyIsIlByb2R1Y3Rpb24uc3VtM0QiLCJQcm9kdWN0aW9uLnN1bTQiLCJQcm9kdWN0aW9uLnN1bTRBIiwiUHJvZHVjdGlvbi5zdW00QiIsIlByb2R1Y3Rpb24uc3VtNEMiLCJQcm9kdWN0aW9uLnN1bTREIiwiUHJvZHVjdGlvbi5zdW01IiwiUHJvZHVjdGlvbi5zdW02IiwiUHJvZHVjdGlvbi5zdW03IiwiUHJvZHVjdGlvbi5zdW03QSIsIlByb2R1Y3Rpb24uc3VtN0IiLCJQcm9kdWN0aW9uLnN1bTdDIiwiUHJvZHVjdGlvbi5zdW03RCIsIlByb2R1Y3Rpb24uc3VtOCIsIlByb2R1Y3Rpb24uc3VtOEEiLCJQcm9kdWN0aW9uLnN1bThCIiwiUHJvZHVjdGlvbi5zdW04QyIsIlByb2R1Y3Rpb24uc3VtOEQiLCJQcm9kdWN0aW9uLnN1bTkiLCJQcm9kdWN0aW9uLnN1bTlBIiwiUHJvZHVjdGlvbi5zdW05QiIsIlByb2R1Y3Rpb24uc3VtOUMiLCJQcm9kdWN0aW9uLnN1bTlEIiwiUHJvZHVjdGlvbi5zdW0xMCIsIlByb2R1Y3Rpb24uc3VtMTEiLCJQcm9kdWN0aW9uLnN1bTEyIiwiUHJvZHVjdGlvbi5zdW0xMyIpKQ0KDQpCaW9tYXNzRGVjJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChEZWMpIikrDQogIGZhY2V0X3dyYXAoflZhcmlhYmxlLCBuY29sID0gNikrDQogIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsODAwMCwgYnkgPTMwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLCA2MDAwLCBieSA9MjAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICB5bGFiKCJQcmVkaWN0ZWQiKSt4bGFiKCJPYnNlcnZlZCIpICt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRXNob290RGVjLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCiAgDQpCaW9tYXNzU2hvb3RFMzI8LUJpb21hc3NEZWMlPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0iUHJvZHVjdGlvbi5zdW00QSIpDQpCaW9tYXNzU2hvb3RFMzIlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcykpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSwgeT1QcmVkaWN0ZWQpLGNvbG91cj0iZ3JlZW4iLHNpemU9MykrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Nob290IERNICgnKmtnfmhhXi0xKicpJykpKSsNCiBteXRoZW1lMw0KYGBgDQoNCiMjI0NvbWJpbmUgaW5jcmVhc2luZiBhbmQgZGVjcmVhc2luZyBzaG9vdCBiaW9tYXNzDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCkJpb21hc3NTaG9vdEUzPC1yYmluZChCaW9tYXNzU2hvb3RFMzEsQmlvbWFzc1Nob290RTMyKQ0KDQpCaW9tYXNzU2hvb3RFMyU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9c2hvb3RiaW9tYXNzKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDEpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVByZWRpY3RlZCksY29sb3VyPSJncmVlbiIsc2l6ZT0zKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYihicXVvdGUoYm9sZCgnU2hvb3QgRE0gKCcqa2d+aGFeLTEqJyknKSkpKw0KIG15dGhlbWUzDQoNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9TaG9vdGJpb21hc3MucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQoNCmBgYA0KDQojIyNzdGlzdGljYWwgbWVhc3VyZW1lbnQNCmBgYHtyfQ0KDQpCaW9tYXNzRGVjICU+JQ0KICBtdXRhdGUoT2JzZXJ2ZWQ9c2hvb3RiaW9tYXNzKSU+JQ0KICBncm91cF9ieShWYXJpYWJsZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuID0gbigpLA0KICAgIHIyID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzVdLA0KICAjICBybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDApLA0KICAgIHJfcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKS9tZWFuKE9ic2VydmVkKSoxMDAsMSksDQogICAgbnNlID0gcm91bmQoTlNFKFByZWRpY3RlZCxPYnNlcnZlZCksMSksDQogICAgc2IgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMV0sDQogIG51ID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzJdLA0KICBsYyA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVszXQ0KICApIA0KIyMjMT0wLjcyLCAwLjc3LCAwLjgyLCAwLjg3LCAwLjkyLCgwLjkzKSwgMC45NywgMS4wMiwgMS4wNywgMS4xMiwgMS4xNywgMS4yMiwgMS4yNywgMS4zMiwxLjM3LCAxLjQyLCAxLjUyLCAxLjYyLCAxLjcyDQoNCmBgYA0KDQoNCg0KIyMjUlVFIHRlc3RpbmcgZm9yIHNlZWRsaW5nIGNyb3ANCg0KYGBge3Isd2lkdGg9NiwgaGVpZ2h0PTh9DQoNCkJpb21hc3NJbmMxIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJJbmMiKSU+JQ0KICBmaWx0ZXIoZlBBUiE9MCklPiUNCiAgZmlsdGVyKFN0YWdlIT0iU2VlZGxpbmciKSU+JQ0KICBkcGx5cjo6c2VsZWN0KEV4cGVyaW1lbnRJRCxUcmVhdG1lbnRJRCxJRCxDbG9jay5Ub2RheSxUZWFydGgsVHJlbmQsU3RhZ2UsR3Jvd3RoUm90YXRpb24sc2hvb3RiaW9tYXNzLFN0UyxQcm9kdWN0aW9uLnN1bTAsUHJvZHVjdGlvbi5zdW0xLFByb2R1Y3Rpb24uc3VtMixQcm9kdWN0aW9uLnN1bTMsUHJvZHVjdGlvbi5zdW0zQSxQcm9kdWN0aW9uLnN1bTNCLFByb2R1Y3Rpb24uc3VtM0MsUHJvZHVjdGlvbi5zdW0zRCxQcm9kdWN0aW9uLnN1bTQsUHJvZHVjdGlvbi5zdW00QSxQcm9kdWN0aW9uLnN1bTRCLFByb2R1Y3Rpb24uc3VtNEMsUHJvZHVjdGlvbi5zdW00RCxQcm9kdWN0aW9uLnN1bTUsUHJvZHVjdGlvbi5zdW02LFByb2R1Y3Rpb24uc3VtNyxQcm9kdWN0aW9uLnN1bTdBLFByb2R1Y3Rpb24uc3VtN0IsUHJvZHVjdGlvbi5zdW03QyxQcm9kdWN0aW9uLnN1bTdELFByb2R1Y3Rpb24uc3VtOCxQcm9kdWN0aW9uLnN1bThBLFByb2R1Y3Rpb24uc3VtOEIsUHJvZHVjdGlvbi5zdW04QyxQcm9kdWN0aW9uLnN1bThELFByb2R1Y3Rpb24uc3VtOSxQcm9kdWN0aW9uLnN1bTlBLFByb2R1Y3Rpb24uc3VtOUIsUHJvZHVjdGlvbi5zdW05QyxQcm9kdWN0aW9uLnN1bTlELFByb2R1Y3Rpb24uc3VtMTAsUHJvZHVjdGlvbi5zdW0xMSxQcm9kdWN0aW9uLnN1bTEyLFByb2R1Y3Rpb24uc3VtMTMpICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUHJvZHVjdGlvbi5zdW0zOlByb2R1Y3Rpb24uc3VtMTApDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMInxHcm93dGhSb3RhdGlvbiE9IjMxIikNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl8xMjFEZWZvbGlhdGlvbkhIRkRGRDUiKQ0KQmlvbWFzc0luYzEgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc0luYzEkVmFyaWFibGUsIGxldmVscz1jKCJQcm9kdWN0aW9uLnN1bTAiLCJQcm9kdWN0aW9uLnN1bTEiLCJQcm9kdWN0aW9uLnN1bTIiLCJQcm9kdWN0aW9uLnN1bTMiLCJQcm9kdWN0aW9uLnN1bTNBIiwiUHJvZHVjdGlvbi5zdW0zQiIsIlByb2R1Y3Rpb24uc3VtM0MiLCJQcm9kdWN0aW9uLnN1bTNEIiwiUHJvZHVjdGlvbi5zdW00IiwiUHJvZHVjdGlvbi5zdW00QSIsIlByb2R1Y3Rpb24uc3VtNEIiLCJQcm9kdWN0aW9uLnN1bTRDIiwiUHJvZHVjdGlvbi5zdW00RCIsIlByb2R1Y3Rpb24uc3VtNSIsIlByb2R1Y3Rpb24uc3VtNiIsIlByb2R1Y3Rpb24uc3VtNyIsIlByb2R1Y3Rpb24uc3VtN0EiLCJQcm9kdWN0aW9uLnN1bTdCIiwiUHJvZHVjdGlvbi5zdW03QyIsIlByb2R1Y3Rpb24uc3VtN0QiLCJQcm9kdWN0aW9uLnN1bTgiLCJQcm9kdWN0aW9uLnN1bThBIiwiUHJvZHVjdGlvbi5zdW04QiIsIlByb2R1Y3Rpb24uc3VtOEMiLCJQcm9kdWN0aW9uLnN1bThEIiwiUHJvZHVjdGlvbi5zdW05IiwiUHJvZHVjdGlvbi5zdW05QSIsIlByb2R1Y3Rpb24uc3VtOUIiLCJQcm9kdWN0aW9uLnN1bTlDIiwiUHJvZHVjdGlvbi5zdW05RCIsIlByb2R1Y3Rpb24uc3VtMTAiLCJQcm9kdWN0aW9uLnN1bTExIiwiUHJvZHVjdGlvbi5zdW0xMiIsIlByb2R1Y3Rpb24uc3VtMTMiKSkNCkJpb21hc3NJbmMxJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChJbmMpIikrDQogIGZhY2V0X3dyYXAoflZhcmlhYmxlLCBuY29sID0gNikrDQogIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsODAwMCwgYnkgPTMwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLCA2MDAwLCBieSA9MjAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICB5bGFiKCJQcmVkaWN0ZWQiKSt4bGFiKCJPYnNlcnZlZCIpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SVUVzaG9vdEluY0U1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQojIyMjc2hvb3QgaW5jDQoNCmBgYHtyLHdpZHRoPTgsIGhlaWdodD04fQ0KQmlvbWFzc1Nob290RTUxPC1CaW9tYXNzSW5jMSU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJQcm9kdWN0aW9uLnN1bTkiKQ0KQmlvbWFzc1Nob290RTUxJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5JRCxuY29sID0gMSkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXksIHk9UHJlZGljdGVkKSxjb2xvdXI9ImdyZWVuIixzaXplPTMpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKGJxdW90ZShib2xkKCdTaG9vdCBETSAoJyprZ35oYV4tMSonKScpKSkrDQogbXl0aGVtZTMNCmBgYA0KDQoNCg0KDQoNCg0KDQpgYGB7cn0NCg0KQmlvbWFzc0luYzEgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1zaG9vdGJpb21hc3MpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuNzIsIDAuNzcsIDAuODIsIDAuODcsIDAuOTIsIDAuOTcsIDEuMDIsIDEuMDcsIDEuMTIsIDEuMTcsIDEuMjIsIDEuMjcsIDEuMzIsMS4zNywgMS40MiwgMS41MiwgMS42MiwgMS43Mg0KDQpgYGANCg0KDQojIyNSVUUgdGVzdGluZyBmb3IgcmVncm93dGggY3JvcA0KDQpgYGB7cix3aWR0aD02LCBoZWlnaHQ9OH0NCg0KQmlvbWFzc0RlYzEgPC0gQmlvbWFzcyAlPiUgDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFNSIpJT4lDQogIGZpbHRlcihzaG9vdGJpb21hc3MhPSJOQSIpJT4lDQogIGZpbHRlcihUcmVuZD09IkRlYyIpJT4lDQogIGZpbHRlcihmUEFSIT0wKSU+JQ0KICBmaWx0ZXIoU3RhZ2UhPSJTZWVkbGluZyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoRXhwZXJpbWVudElELFRyZWF0bWVudElELElELENsb2NrLlRvZGF5LFRlYXJ0aCxUcmVuZCxTdGFnZSxHcm93dGhSb3RhdGlvbixzaG9vdGJpb21hc3MsU3RTLFByb2R1Y3Rpb24uc3VtMCxQcm9kdWN0aW9uLnN1bTEsUHJvZHVjdGlvbi5zdW0yLFByb2R1Y3Rpb24uc3VtMyxQcm9kdWN0aW9uLnN1bTNBLFByb2R1Y3Rpb24uc3VtM0IsUHJvZHVjdGlvbi5zdW0zQyxQcm9kdWN0aW9uLnN1bTNELFByb2R1Y3Rpb24uc3VtNCxQcm9kdWN0aW9uLnN1bTRBLFByb2R1Y3Rpb24uc3VtNEIsUHJvZHVjdGlvbi5zdW00QyxQcm9kdWN0aW9uLnN1bTRELFByb2R1Y3Rpb24uc3VtNSxQcm9kdWN0aW9uLnN1bTYsUHJvZHVjdGlvbi5zdW03LFByb2R1Y3Rpb24uc3VtN0EsUHJvZHVjdGlvbi5zdW03QixQcm9kdWN0aW9uLnN1bTdDLFByb2R1Y3Rpb24uc3VtN0QsUHJvZHVjdGlvbi5zdW04LFByb2R1Y3Rpb24uc3VtOEEsUHJvZHVjdGlvbi5zdW04QixQcm9kdWN0aW9uLnN1bThDLFByb2R1Y3Rpb24uc3VtOEQsUHJvZHVjdGlvbi5zdW05LFByb2R1Y3Rpb24uc3VtOUEsUHJvZHVjdGlvbi5zdW05QixQcm9kdWN0aW9uLnN1bTlDLFByb2R1Y3Rpb24uc3VtOUQsUHJvZHVjdGlvbi5zdW0xMCxQcm9kdWN0aW9uLnN1bTExLFByb2R1Y3Rpb24uc3VtMTIsUHJvZHVjdGlvbi5zdW0xMykgJT4lDQogIHRpZHlyOjpnYXRoZXIoIlZhcmlhYmxlIiwiUHJlZGljdGVkIixQcm9kdWN0aW9uLnN1bTM6UHJvZHVjdGlvbi5zdW0xMCkNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwifEdyb3d0aFJvdGF0aW9uIT0iMzEiKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpDQpCaW9tYXNzRGVjMSAkVmFyaWFibGU8LWZhY3RvcihCaW9tYXNzRGVjMSRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb2R1Y3Rpb24uc3VtMCIsIlByb2R1Y3Rpb24uc3VtMSIsIlByb2R1Y3Rpb24uc3VtMiIsIlByb2R1Y3Rpb24uc3VtMyIsIlByb2R1Y3Rpb24uc3VtM0EiLCJQcm9kdWN0aW9uLnN1bTNCIiwiUHJvZHVjdGlvbi5zdW0zQyIsIlByb2R1Y3Rpb24uc3VtM0QiLCJQcm9kdWN0aW9uLnN1bTQiLCJQcm9kdWN0aW9uLnN1bTRBIiwiUHJvZHVjdGlvbi5zdW00QiIsIlByb2R1Y3Rpb24uc3VtNEMiLCJQcm9kdWN0aW9uLnN1bTREIiwiUHJvZHVjdGlvbi5zdW01IiwiUHJvZHVjdGlvbi5zdW02IiwiUHJvZHVjdGlvbi5zdW03IiwiUHJvZHVjdGlvbi5zdW03QSIsIlByb2R1Y3Rpb24uc3VtN0IiLCJQcm9kdWN0aW9uLnN1bTdDIiwiUHJvZHVjdGlvbi5zdW03RCIsIlByb2R1Y3Rpb24uc3VtOCIsIlByb2R1Y3Rpb24uc3VtOEEiLCJQcm9kdWN0aW9uLnN1bThCIiwiUHJvZHVjdGlvbi5zdW04QyIsIlByb2R1Y3Rpb24uc3VtOEQiLCJQcm9kdWN0aW9uLnN1bTkiLCJQcm9kdWN0aW9uLnN1bTlBIiwiUHJvZHVjdGlvbi5zdW05QiIsIlByb2R1Y3Rpb24uc3VtOUMiLCJQcm9kdWN0aW9uLnN1bTlEIiwiUHJvZHVjdGlvbi5zdW0xMCIsIlByb2R1Y3Rpb24uc3VtMTEiLCJQcm9kdWN0aW9uLnN1bTEyIiwiUHJvZHVjdGlvbi5zdW0xMyIpKQ0KQmlvbWFzc0RlYzElPiUNCiAgZ2dwbG90KGFlcyh4PXNob290YmlvbWFzcywgeT0gUHJlZGljdGVkLCBjb2xvdXI9IGZhY3RvcihJRCkpKSArDQogIGdlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxKSArDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMSkrDQogIGdndGl0bGUoIlNob290IGJpb21hc3MgKERlYykiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA2KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikrIA0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRXNob290RGVjRTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQpgYGANCiMjI3Nob290IERlYw0KDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9OH0NCkJpb21hc3NTaG9vdEU1MjwtQmlvbWFzc0RlYzElPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0iUHJvZHVjdGlvbi5zdW00QSIpDQpCaW9tYXNzU2hvb3RFNTIlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcykpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSwgeT1QcmVkaWN0ZWQpLGNvbG91cj0iZ3JlZW4iLHNpemU9MykrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Nob290IERNICgnKmtnfmhhXi0xKicpJykpKSsNCiBteXRoZW1lMw0KYGBgDQojIyNDb21iaW5lIGluY3JlYXNpbmYgYW5kIGRlY3JlYXNpbmcgc2hvb3QgYmlvbWFzcw0KYGBge3Isd2lkdGg9OCwgaGVpZ2h0PTZ9DQpCaW9tYXNzU2hvb3RFNTwtcmJpbmQoQmlvbWFzc1Nob290RTUxLEJpb21hc3NTaG9vdEU1MikNCg0KQmlvbWFzc1Nob290RTUlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcykpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSwgeT1QcmVkaWN0ZWQpLGNvbG91cj0iZ3JlZW4iLHNpemU9MykrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Nob290IERNICgnKmtnfmhhXi0xKicpJykpKSsNCiBteXRoZW1lMw0KDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvU2hvb3RiaW9tYXNzRTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpCaW9tYXNzRGVjMSAlPiUNCiAgbXV0YXRlKE9ic2VydmVkPXNob290YmlvbWFzcyklPiUNCiAgICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IiklPiUNCiAgZ3JvdXBfYnkoVmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICByMiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVs1XSwNCiAgIyAgcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKSwwKSwNCiAgICByX3Jtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCkvbWVhbihPYnNlcnZlZCkqMTAwLDEpLA0KICAgIG5zZSA9IHJvdW5kKE5TRShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDEpLA0KICAgIHNiID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzFdLA0KICBudSA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsyXSwNCiAgbGMgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbM10NCiAgKSANCiMjIzE9MC44MiwwLjkyLCAxLjAyLCAxLjEyLCAxLjIyLCAxLjMyLCAxLjQyLCAxLjUyLDEuNjIsIDEuNzINCg0KYGBgDQojIyNSVUUgdGVzdGluZyBmb3Igc2VlZGxpbmcgY3JvcA0KDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9OH0NCg0KQmlvbWFzc1NlZWRsaW5nIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICAjZmlsdGVyKFRyZW5kPT0iRGVjIiklPiUNCiAgZmlsdGVyKGZQQVIhPTApJT4lDQogIGZpbHRlcihTdGFnZT09IlNlZWRsaW5nIiklPiUNCiAgZHBseXI6OnNlbGVjdChFeHBlcmltZW50SUQsVHJlYXRtZW50SUQsSUQsQ2xvY2suVG9kYXksVGVhcnRoLFRyZW5kLFN0YWdlLEdyb3d0aFJvdGF0aW9uLHNob290YmlvbWFzcyxTdFMsUHJvZHVjdGlvbi5zdW0wLFByb2R1Y3Rpb24uc3VtMSxQcm9kdWN0aW9uLnN1bTIsUHJvZHVjdGlvbi5zdW0zLFByb2R1Y3Rpb24uc3VtM0EsUHJvZHVjdGlvbi5zdW0zQixQcm9kdWN0aW9uLnN1bTNDLFByb2R1Y3Rpb24uc3VtM0QsUHJvZHVjdGlvbi5zdW00LFByb2R1Y3Rpb24uc3VtNEEsUHJvZHVjdGlvbi5zdW00QixQcm9kdWN0aW9uLnN1bTRDLFByb2R1Y3Rpb24uc3VtNEQsUHJvZHVjdGlvbi5zdW01LFByb2R1Y3Rpb24uc3VtNixQcm9kdWN0aW9uLnN1bTcpICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUHJvZHVjdGlvbi5zdW0wOlByb2R1Y3Rpb24uc3VtNykNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwifEdyb3d0aFJvdGF0aW9uIT0iMzEiKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpDQpCaW9tYXNzU2VlZGxpbmcgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc1NlZWRsaW5nJFZhcmlhYmxlLCBsZXZlbHM9YygiUHJvZHVjdGlvbi5zdW0wIiwiUHJvZHVjdGlvbi5zdW0xIiwiUHJvZHVjdGlvbi5zdW0yIiwiUHJvZHVjdGlvbi5zdW0zIiwiUHJvZHVjdGlvbi5zdW0zQSIsIlByb2R1Y3Rpb24uc3VtM0IiLCJQcm9kdWN0aW9uLnN1bTNDIiwiUHJvZHVjdGlvbi5zdW0zRCIsIlByb2R1Y3Rpb24uc3VtNCIsIlByb2R1Y3Rpb24uc3VtNEEiLCJQcm9kdWN0aW9uLnN1bTRCIiwiUHJvZHVjdGlvbi5zdW00QyIsIlByb2R1Y3Rpb24uc3VtNEQiLCJQcm9kdWN0aW9uLnN1bTUiLCJQcm9kdWN0aW9uLnN1bTYiLCJQcm9kdWN0aW9uLnN1bTciLCJQcm9kdWN0aW9uLnN1bTdBIiwiUHJvZHVjdGlvbi5zdW03QiIsIlByb2R1Y3Rpb24uc3VtN0MiLCJQcm9kdWN0aW9uLnN1bTdEIiwiUHJvZHVjdGlvbi5zdW04IiwiUHJvZHVjdGlvbi5zdW04QSIsIlByb2R1Y3Rpb24uc3VtOEIiLCJQcm9kdWN0aW9uLnN1bThDIiwiUHJvZHVjdGlvbi5zdW04RCIsIlByb2R1Y3Rpb24uc3VtOSIsIlByb2R1Y3Rpb24uc3VtOUEiLCJQcm9kdWN0aW9uLnN1bTlCIiwiUHJvZHVjdGlvbi5zdW05QyIsIlByb2R1Y3Rpb24uc3VtOUQiLCJQcm9kdWN0aW9uLnN1bTEwIiwiUHJvZHVjdGlvbi5zdW0xMSIsIlByb2R1Y3Rpb24uc3VtMTIiLCJQcm9kdWN0aW9uLnN1bTEzIikpDQoNCg0KQmlvbWFzc1NlZWRsaW5nJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChTZWVkbGluZykiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA2KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikgKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRVNlZWRsaW5nLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQoNCmBgYHtyfQ0KDQpCaW9tYXNzU2VlZGxpbmcgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1zaG9vdGJpb21hc3MpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuODIsMC45MiwgMS4wMiwgMS4xMiwgMS4yMiwgMS4zMiwgMS40MiwgMS41MiwxLjYyLCAxLjcyDQoNCmBgYA0KDQojIyMjUm9vdCBwcmVkaWN0ZWQgZm9yIEUzDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCg0KQmlvbWFzc1Jvb3QgPC0gQmlvbWFzcyAlPiUgDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFMyIpJT4lDQogIGZpbHRlcihSb290V3QhPSJOQSIpJT4lDQogICNmaWx0ZXIoU3RhZ2UhPSJTZWVkbGluZyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoRXhwZXJpbWVudElELFRyZWF0bWVudElELElELENsb2NrLlRvZGF5LFRlYXJ0aCxUcmVuZCwgU3RhZ2UsR3Jvd3RoUm90YXRpb24sUm9vdFd0LFN0UyxUb3RhbEJpb21hc3MsUHJvb3QuMC4wNDUuLCBQcm9vdDEuMC4wMy4sUHJvb3QyLjAuMDEuLFByb290My4wLjAwNS4sUHJvb3Q0LjAuMDAzLixQcm9vdDUuMC4wMDIuLFByb290Ni4wLjAwMDUuLFByb290Ny4wLjAwMDUuLFByb290OC4wLjIuLFByb290OS4wLjI1LikgJT4lDQogIHRpZHlyOjpnYXRoZXIoIlZhcmlhYmxlIiwiUHJlZGljdGVkIixQcm9vdC4wLjA0NS46UHJvb3Q5LjAuMjUuKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCkJpb21hc3NSb290ICRWYXJpYWJsZTwtZmFjdG9yKEJpb21hc3NSb290JFZhcmlhYmxlLCBsZXZlbHM9YygiUHJvb3QuMC4wNDUuIiwgIlByb290MS4wLjAzLiIsIlByb290Mi4wLjAxLiIsIlByb290My4wLjAwNS4iLCJQcm9vdDQuMC4wMDMuIiwiUHJvb3Q1LjAuMDAyLiIsIlByb290Ni4wLjAwMDUuIiwiUHJvb3Q3LjAuMDAwNS4iLCJQcm9vdDguMC4yLiIsIlByb290OS4wLjI1LiIpKQ0KDQpCaW9tYXNzUm9vdCU+JQ0KICBnZ3Bsb3QoYWVzKHg9Um9vdFd0LCB5PSBQcmVkaWN0ZWQsIGNvbG91cj0gZmFjdG9yKElEKSkpICsNCiAgZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpICsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSAxKSsNCiAgZ2d0aXRsZSgiUm9vdCBiaW9tYXNzIChFMykiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA0KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikgKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RXdEUzLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQoNCmBgYHtyfQ0KDQpCaW9tYXNzUm9vdCAlPiUNCiAgbXV0YXRlKE9ic2VydmVkPVJvb3RXdCklPiUNCiAgICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IiklPiUNCiAgZ3JvdXBfYnkoVmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICByMiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVs1XSwNCiAgIyAgcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKSwwKSwNCiAgICByX3Jtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCkvbWVhbihPYnNlcnZlZCkqMTAwLDEpLA0KICAgIG5zZSA9IHJvdW5kKE5TRShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDEpLA0KICAgIHNiID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzFdLA0KICBudSA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsyXSwNCiAgbGMgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbM10NCiAgKSANCiMjIzE9MC44MiwwLjkyLCAxLjAyLCAxLjEyLCAxLjIyLCAxLjMyLCAxLjQyLCAxLjUyLDEuNjIsIDEuNzINCg0KYGBgDQpgYGB7cn0NCkJpb21hc3NSb290JT4lDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFMyIpJT4lDQogIGZpbHRlcihSb290V3QhPSJOQSIpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09IlByb290OS4wLjI1LiIpJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVByZWRpY3RlZCkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDIpKw0KIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFd0KSxjb2xvdXI9ImdyZWVuIixzaXplPTMpK215dGhlbWUzKw0KIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Jvb3QgRE0gKCcqa2d+aGFeLTEqJyknKSkpDQogIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9Sb290V3RwcmVkaWN0ZWRFMy5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQojIyMjUm9vdCBwcmVkaWN0ZWQgZm9yIEU1DQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCg0KQmlvbWFzc1Jvb3QxIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoUm9vdFd0IT0iTkEiKSU+JQ0KICAjZmlsdGVyKFN0YWdlIT0iU2VlZGxpbmciKSU+JQ0KICBkcGx5cjo6c2VsZWN0KEV4cGVyaW1lbnRJRCxUcmVhdG1lbnRJRCxJRCxDbG9jay5Ub2RheSxUZWFydGgsVHJlbmQsIFN0YWdlLEdyb3d0aFJvdGF0aW9uLFJvb3RXdCxTdFMsVG90YWxCaW9tYXNzLFByb290LjAuMDQ1LiwgUHJvb3QxLjAuMDMuLFByb290Mi4wLjAxLixQcm9vdDMuMC4wMDUuLFByb290NC4wLjAwMy4sUHJvb3Q1LjAuMDAyLixQcm9vdDYuMC4wMDA1LixQcm9vdDcuMC4wMDA1LixQcm9vdDguMC4yLixQcm9vdDkuMC4yNS4pICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUHJvb3QuMC4wNDUuOlByb290OS4wLjI1LikNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwifEdyb3d0aFJvdGF0aW9uIT0iMzEiKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpDQpCaW9tYXNzUm9vdCAkVmFyaWFibGU8LWZhY3RvcihCaW9tYXNzUm9vdCRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb290LjAuMDQ1LiIsICJQcm9vdDEuMC4wMy4iLCJQcm9vdDIuMC4wMS4iLCJQcm9vdDMuMC4wMDUuIiwiUHJvb3Q0LjAuMDAzLiIsIlByb290NS4wLjAwMi4iLCJQcm9vdDYuMC4wMDA1LiIsIlByb290Ny4wLjAwMDUuIiwiUHJvb3Q4LjAuMi4iLCJQcm9vdDkuMC4yNS4iKSkNCg0KQmlvbWFzc1Jvb3QxJT4lDQogIGdncGxvdChhZXMoeD1Sb290V3QsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJSb290IGJpb21hc3MgKEU1KSIpKw0KICBmYWNldF93cmFwKH5WYXJpYWJsZSwgbmNvbCA9IDQpKw0KICB0aGVtZV9idygpK215dGhlbWUzKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLDgwMDAsIGJ5ID0zMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCwgNjAwMCwgYnkgPTIwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgeWxhYigiUHJlZGljdGVkIikreGxhYigiT2JzZXJ2ZWQiKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiBnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUm9vdFd0RTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCmBgYHtyfQ0KDQpCaW9tYXNzUm9vdDEgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1Sb290V3QpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuODIsMC45MiwgMS4wMiwgMS4xMiwgMS4yMiwgMS4zMiwgMS40MiwgMS41MiwxLjYyLCAxLjcyDQoNCmBgYA0KDQpgYGB7cn0NCkJpb21hc3NSb290MSU+JQ0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoUm9vdFd0IT0iTkEiKSU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJQcm9vdDkuMC4yNS4iKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1QcmVkaWN0ZWQpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KIGZhY2V0X3dyYXAofklELG5jb2wgPSAyKSsNCiBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RXdCksY29sb3VyPSJncmVlbiIsc2l6ZT0zKStteXRoZW1lMysNCiB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKGJxdW90ZShib2xkKCdSb290IERNICgnKmtnfmhhXi0xKicpJykpKQ0KICBnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUm9vdFd0cHJlZGljdGVkRTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCg0KDQoNCg0KDQojIyMjI2F2ZXJhZ2Ugb2YgcGFydGl0aW9uaW5nIHJhdGUNCiMjIyNhdmVyYWdlIG9mIGN1dHRpbmcgdHJlYXRtZW50DQpgYGB7cixoZWlnaHQ9NCwgZmlnLndpZHRoPTh9DQoNCkJpb21hc3MyPC1CaW9tYXNzJT4lDQogIGZpbHRlcihQYXJ0aXRpb25pbmchPSJOQSIpJT4lDQogIGdyb3VwX2J5KEdyb3d0aFNlYXNvbixSb3RhdGlvbixHcm93dGhSb3RhdGlvbixUbWVhbixQcG0sU3RhZ2UsVHJlbmQsSUQsRXhwZXJpbWVudElEKSAlPiUNCiAgZG8obW9kMSA9IGxtKFN0b3JhZ2UyflR0X2Jyb2tlbl9zdW0sZGF0YT0uKSkgJT4lDQogIG11dGF0ZShQUmF0ZTEgPSBzdW1tYXJ5KG1vZDEpJGNvZWZmWzJdKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtbW9kMSkNCiANCg0KbGlicmFyeShwbHlyKQ0KDQpsbV9lcW4xIDwtIGZ1bmN0aW9uKEJpb21hc3MyKXsNCiAgbSA8LSBsbShQUmF0ZTF+UHBtICxCaW9tYXNzMik7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IFBwbSArUFJhdGUxICUuJSBpdGFsaWMoUFJhdGUxKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChQcG0gPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgUFJhdGUxPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxcyA8LSBkZHBseShCaW9tYXNzMiwuKFRyZW5kLFN0YWdlKSxsbV9lcW4xKQ0KI2RmMiA8LSBkYXRhLmZyYW1lKGVxID0gdW5jbGFzcyhlcW5zKSwgQ29sbGVjdGlvbiA9IGFzLm51bWVyaWMobmFtZXMoZXFucykpKQ0KI3lsYWIoYnF1b3RlKGJvbGQoJ0xFQVIgKCcqbV4yfm1eLTJ+J7BDZCdeLTEqJyknKSkpDQoNCg0KQmlvbWFzczIlPiUNCiAgZ2dwbG90KGFlcyh4PVBwbSwgeT1QUmF0ZTEsY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZmFjZXRfZ3JpZChTdGFnZX5UcmVuZCkgKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fdGV4dChkYXRhID0gZXFzLCBhZXMoeCA9MTMuNSwgeSA9IDI1LCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTUpK3hsYWIoIk1lYW4gcGhvdG9wZXJpb2QgKGgpIikrDQogIHlsYWIoYnF1b3RlKGJvbGQoJ1Jvb3Qgc3RvcmFnZSByYXRlICgnKidrZyd+J2hhJ14tMX4nsENkJ14tMSonKScpKSkNCg0KDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhSYXRlMS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCg0KZGV0YWNoKHBhY2thZ2U6cGx5cikNCmBgYA0KDQojIyMjUm9vdCBncm93dGggcmF0ZSBmb3IgZGl2aWR1YWwgZXhwZXJpbWVudA0KYGBge3IsaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0NCg0KQmlvbWFzczM8LUJpb21hc3MlPiUNCmZpbHRlcihJRD09IkU1SUxMRjUiKSU+JQ0KICBmaWx0ZXIoUGFydGl0aW9uaW5nIT0iTkEiKSU+JQ0KICBtdXRhdGUoUGFydC5SYXRlPVBhcnRpdGlvbmluZy9UdF9icm9rZW5fc3VtKSU+JQ0KICAgZmlsdGVyKFBhcnQuUmF0ZT4wKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9VHRfYnJva2VuX3N1bSwgeT1QYXJ0LlJhdGUsY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MSkrDQogIGZhY2V0X2dyaWQoR3Jvd3RoU2Vhc29uflJvdGF0aW9uKSArIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikgDQogICNnZW9tX3BvaW50KGFlcyh5PVJvb3RXdCxzaXplPTIpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFJlc3BpcmF0aW9uMikNCg0KYGBgDQoNCg0KDQoNCiMjIyMjIGludGVyY2VwdHVsYXRlIHBhcnRpb25pbmcgcmF0ZQ0KIyMjZ29vZCBlZmZvcnQgYnV0IE5vISEhISEhDQpgYGB7cn0NCiMjI2ZQQVIgaW50ZXJwb2xhdGUgZm9yIGVhY2ggcm90YXRpb24NCg0KIyBVbmlFeHAgPC0gdW5pcXVlKEJpb21hc3MuTEwkRXhwTmFtZSkNCiMgDQojIEJpb21hc3MuTEwuZGYgPC0gZGF0YS5mcmFtZSgpDQojICAgDQojIGZvcihpIGluIDE6bGVuZ3RoKFVuaUV4cCkpDQojIHsNCiMgICANCiMgIEJpb21hc3MuTEwuZXg8LUJpb21hc3MuTEwgJT4lDQojICAgbXV0YXRlKFBQUj1hcHByb3goQ2xvY2suVG9kYXksUGFydGl0aW9uaW5nUmF0ZTIsIHhvdXQgPUNsb2NrLlRvZGF5LCANCiMgICAgICAgICAgbWV0aG9kPSJsaW5lYXIiLCANCiMgICAgICAgICAgcnVsZSA9IDIpJHkpICAgICMjaW50ZXJwb2xhdGUgZnVuY3Rpb24NCiMgQmlvbWFzcy5MTC5kZjwtIHJiaW5kKCBCaW9tYXNzLkxMLmV4LCBCaW9tYXNzLkxMLmRmKQ0KIyANCiMgfQ0KIyANCiMgQmlvbWFzcy5MTC5kZiANCiMgd3JpdGUuY3N2KEJpb21hc3MuTEwuZGYgLCJEOi9SL1Jlc3BpcmF0aW9uL0Jpb21hc3MuTEwuZGYgLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQojIyMjQ2FsY3VsYXRlZCBSVUUNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRVQ8LUJpb21hc3MlPiUNCiAgZmlsdGVyKFJvb3RXdCE9Ik5BIiklPiUNCiAgZmlsdGVyKFRvdGFsQmlvbWFzcyE9Ik5BIikNCg0KUlVFRTM8LVJVRVQlPiUNCiAgZmlsdGVyKEV4cGVyaW1lbnRJRD09IkU1IiklPiUNCiAgbXV0YXRlKFJvb3RXdD1Sb290V3QvMC44KSU+JQ0KICBtdXRhdGUoVG90YWxCaW9tYXNzPVJvb3RXdCtzaG9vdGJpb21hc3MpJT4lDQogIG11dGF0ZShUb3RhbEJpb21hc3MxPVRvdGFsQmlvbWFzcyowLjEpDQoNClJVRTU8LVJVRVQlPiUNCiAgZmlsdGVyKEV4cGVyaW1lbnRJRD09IkUzIiklPiUNCiAgbXV0YXRlKFRvdGFsQmlvbWFzczE9VG90YWxCaW9tYXNzKjAuMSkNCg0KUlVFPC1yYmluZChSVUVFMyxSVUU1KQ0KIA0KDQpSVUUlPiUNCiAgZmlsdGVyKElEPT0iRTNJTEwiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTNJTEwiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQoNCmBgYA0KDQpgYGB7cixoZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpSVUUlPiUNCiAgZmlsdGVyKElEPT0iRTNJTFMiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTNJTFMiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQpgYGANCg0KYGBge3IsaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0KUlVFJT4lDQogIGZpbHRlcihJRD09IkUzSVNMIiklPiUNCiAgZ2dwbG90KGFlcyh4PUFjY1BBUmkseT1Ub3RhbEJpb21hc3MxKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogICAgeGxhYihicXVvdGUoYm9sZCgnQWNjdW11bGF0ZWQgUEFSaSAoJypNSn5tXi0yKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdUb3RhbCBETSAoJypnfkRNfm1eLTIqJyknKSkpKw0KICAgIGdndGl0bGUoIkUzSVNMIikgICsNCiBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJibHVlIikrDQogZmFjZXRfZ3JpZChHcm93dGhTZWFzb25+Um90YXRpb24pK215dGhlbWUzKw0Kc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNjAwLCBieSA9NjAwKSwgbGltaXRzPWMoMCwxNjAwKSkrDQogc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAsIDgwMCwgYnkgPTQwMCksIGxpbWl0cz1jKDAsODAwKSkNCg0KYGBgDQpgYGB7cixoZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpSVUUlPiUNCiAgZmlsdGVyKElEPT0iRTNJU1MiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTNJU1MiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDgwMCwgYnkgPTMwMCksIGxpbWl0cz1jKDAsODAwKSkrDQogc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAsIDgwMCwgYnkgPTQwMCksIGxpbWl0cz1jKDAsODAwKSkNCg0KYGBgDQoNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlISEY1IiklPiUNCiAgZ2dwbG90KGFlcyh4PUFjY1BBUmkseT1Ub3RhbEJpb21hc3MxKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogICAgeGxhYihicXVvdGUoYm9sZCgnQWNjdW11bGF0ZWQgUEFSaSAoJypNSn5tXi0yKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdUb3RhbCBETSAoJypnfkRNfm1eLTIqJyknKSkpKw0KICAgIGdndGl0bGUoIkU1SUhIRjUiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQpgYGANCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlMTEY1IiklPiUNCiAgZ2dwbG90KGFlcyh4PUFjY1BBUmkseT1Ub3RhbEJpb21hc3MxKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogICAgeGxhYihicXVvdGUoYm9sZCgnQWNjdW11bGF0ZWQgUEFSaSAoJypNSn5tXi0yKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdUb3RhbCBETSAoJypnfkRNfm1eLTIqJyknKSkpKw0KICAgIGdndGl0bGUoIkU1SUxMRjUiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQpgYGANCg0KYGBge3IsaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0KUlVFJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTVJU1NGNSIpICArDQogZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iYmx1ZSIpKw0KIGZhY2V0X2dyaWQoR3Jvd3RoU2Vhc29uflJvdGF0aW9uKStteXRoZW1lMysNCnNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTYwMCwgYnkgPTYwMCksIGxpbWl0cz1jKDAsMTYwMCkpKw0KIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwLCA4MDAsIGJ5ID00MDApLCBsaW1pdHM9YygwLDgwMCkpDQoNCmBgYA0KIyMjUlVFDQoNCmBgYHtyfQ0KUlVFVG90YWw8LVJVRSU+JQ0KZ3JvdXBfYnkoRXhwTmFtZSxHcm93dGhTZWFzb24sUm90YXRpb24sR3Jvd3RoUm90YXRpb24sVG1lYW4sUHBtLFN0YWdlLFRyZW5kLElELEV4cGVyaW1lbnRJRCxEZWZvbGlhdGlvbikgJT4lDQogIGRvKG1vZCA9IGxtKFRvdGFsQmlvbWFzczF+QWNjUEFSaSxkYXRhPS4pKSAlPiUNCiAgbXV0YXRlKFJVRXQgPSBzdW1tYXJ5KG1vZCkkY29lZmZbMl0pICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1tb2QpDQogIA0KYGBgDQoNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRVRvdGFsJFRyZW5kPC0gZmFjdG9yKFJVRVRvdGFsJFRyZW5kLCBsZXZlbHM9YygiSW5jIiwiRGVjIikpDQoNClJVRVRvdGFsMTwtUlVFVG90YWwlPiUNCiAgZHBseXI6OmZpbHRlcihSVUV0PjApJT4lDQogIGRwbHlyOjpmaWx0ZXIoUlVFdDwyKSU+JQ0KICBmaWx0ZXIoRGVmb2xpYXRpb249PSJMTCIpJT4lDQogICBkcGx5cjo6ZmlsdGVyKEV4cE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTEdzXzJSdF82IiklPiUNCiAgZHBseXI6OmZpbHRlcihFeHBOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTExHc18yUnRfNyIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRXhwTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25MTEZERkQ1R3NfNFJ0XzIiKQ0KICANCg0KbGlicmFyeShwbHlyKQ0KDQpsbV9lcW4yIDwtIGZ1bmN0aW9uKFJVRVRvdGFsMSl7DQogIG0gPC0gbG0oUlVFdH5UbWVhbiAsUlVFVG90YWwxKTsNCiAgZXEgPC0gc3Vic3RpdHV0ZShpdGFsaWMoeSkgPT0gVG1lYW4gK1JVRXQgJS4lIGl0YWxpYyhSVUV0KSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChUbWVhbiA9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBSVUV0PSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxc1JVRSA8LSBkZHBseShSVUVUb3RhbDEsLihTdGFnZSxUcmVuZCksbG1fZXFuMikNCg0KUlVFVG90YWwxJT4lDQogIGZpbHRlcihEZWZvbGlhdGlvbj09IkxMIiklPiUNCiAgZ2dwbG90KGFlcyh4PVRtZWFuLHk9UlVFdCxjb2xvdXI9SUQsbGFiZWw9R3Jvd3RoUm90YXRpb24pKStnZW9tX3RleHQoKSt0aGVtZV9idygpKw0KICAgIHhsYWIoJ01lYW4gdGVtcGVyYXR1cmUgKLBDKScpK3lsYWIoYnF1b3RlKGJvbGQoJ1JVRSAoJypnfk1KXi0xKicpJykpKSsNCiAgICBnZ3RpdGxlKCJFNUlTU0Y1IikgICsNCiBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJibHVlIikrDQogI2ZhY2V0X2dyaWQoU3RhZ2V+VHJlbmQpKw0KICBmYWNldF9ncmlkKFRyZW5kflN0YWdlKSsNCiAgbXl0aGVtZTMrDQpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCAxOCwgYnkgPTMpLCBsaW1pdHM9YygxMCwxOCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIsIGJ5ID0xKSwgbGltaXRzPWMoMCwyKSkrDQpnZW9tX3RleHQoZGF0YSA9IGVxc1JVRSwgYWVzKHggPTEzLjUsIHkgPSAyLCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTQpDQoNCg0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SVUUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTQsIGRwaT01MDApDQoNCmRldGFjaChwYWNrYWdlOnBseXIpDQoNCg0KYGBgDQoNCg0KDQojIyNwcmVkaWN0ZWQgVnMgb2JzZXJ2ZWQgZm9yIHBhcnRpdGlvbmcgDQpgYGB7cn0NCkJpb21hc3MuTEwlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFM0lMTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCmBgYA0KIyMjIFJvb3QgcGFydGl0aW9uaW5nIHJhdGUgYW5hbHlzaXMNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpCaW9tYXNzJFRyZW5kPC1mYWN0b3IoQmlvbWFzcyRUcmVuZCwgbGV2ZWxzPWMoIkluYyIsICJEZWMiKSkNCg0KDQpCaW9tYXNzJT4lICANCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpJT4lDQogIGZpbHRlcihQYXJ0aXRpb25pbmdSZXIxPjApJT4lDQogICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KICBtdXRhdGUoUm90YXRpb249YXMuZmFjdG9yKFJvdGF0aW9uKSxHcm93dGhTZWFzb249YXMuZmFjdG9yKEdyb3d0aFNlYXNvbikpJT4lICAgICAgICAjIyMjUm9vdCBiaW9tYXNzIGp1c3QgZnJvbSByZXNwaXJhdGlvbiAwLjAzDQogIGdncGxvdChhZXMoeD1QcCwgeT1QYXJ0aXRpb25pbmdSZXIxKSkrZ2VvbV9wb2ludChzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGZhY2V0X2dyaWQoSUR+VHJlbmQpK3hsYWIoIlBob3RvcGVyaW9kIChoKSIpKw0KICB5bGFiKCJQcm9vdCIpKw0KICAjc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMCwgMTcsIGJ5ID0yKSwgbGltaXRzPWMoMTAsMTcpKSsNCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMC41LCBieSA9MC41KSwgbGltaXRzPWMoMCwwLjUpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iYmx1ZSIpDQoNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9FMy5Qcm9vdC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQojIyMgUm9vdCBwYXJ0aXRpb25pbmcgcmF0ZSBhbmFseXNpcw0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCkJpb21hc3MkVHJlbmQ8LWZhY3RvcihCaW9tYXNzJFRyZW5kLCBsZXZlbHM9YygiSW5jIiwgIkRlYyIpKQ0KDQoNCkJpb21hc3MlPiUgIA0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIiklPiUNCiAgZmlsdGVyKFBhcnRpdGlvbmluZ1JlcjE+MCklPiUNCiAgIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFNSIpJT4lDQogIG11dGF0ZShSb3RhdGlvbj1hcy5mYWN0b3IoUm90YXRpb24pLEdyb3d0aFNlYXNvbj1hcy5mYWN0b3IoR3Jvd3RoU2Vhc29uKSklPiUgICAgICAgICMjIyNSb290IGJpb21hc3MganVzdCBmcm9tIHJlc3BpcmF0aW9uIDAuMDMNCiAgZ2dwbG90KGFlcyh4PVBwLCB5PVBhcnRpdGlvbmluZ1JlcjEpKStnZW9tX3BvaW50KHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZmFjZXRfZ3JpZChJRH5UcmVuZCkreGxhYigiUGhvdG9wZXJpb2QgKGgpIikrDQogIHlsYWIoIlByb290IikrDQogICNzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCAxNywgYnkgPTIpLCBsaW1pdHM9YygxMCwxNykpKw0KICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAwLjUsIGJ5ID0wLjUpLCBsaW1pdHM9YygwLDAuNSkpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJibHVlIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0U1LlByb290LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCg0KIyMjTFMgUm9vdCBhbmFseXNpcw0KYGBge3J9DQpCaW9tYXNzLkxTPC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkUzSUxTIiklPiUNCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpDQpCaW9tYXNzLkxTJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSwgeT1Sb290UmVzcGlyYXRpb24xKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RSZXNwaXJhdGlvbjIpKStnZ3RpdGxlKHBhc3RlMCgiRTNJTFMiKSkrDQogeGxhYigiRGF0ZSIpK3lsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikrdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgDQoNCiMjI3ByZWRpY3RlZCBWcyBvYnNlcnZlZCBmb3IgcGFydGl0aW9uZyANCmBgYHtyfQ0KQmlvbWFzcy5MUyU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFAxKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3QpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAyKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMykpK2dlb21fbGluZShhZXMoeT1Sb290UDQpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA1KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNikpK2dlb21fbGluZShhZXMoeT1Sb290UDcpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA4KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOSkpK2dlb21fbGluZShhZXMoeT1Sb290UDEwKSkreGxhYigiRGF0ZSIpKw0KICB5bGFiKCJSb290IGJpb21hc3MgKGtnL2hhKSIpDQoNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9Sb290R3Jvd3RoRTNJTFMucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTQsIGRwaT01MDApDQpgYGANCg0KDQojIyMjU0wgcm9vdCBhbmFseXNpcw0KYGBge3J9DQpCaW9tYXNzLlNMPC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkUzSVNMIiklPiUNCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpDQpCaW9tYXNzLlNMJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSwgeT1Sb290UmVzcGlyYXRpb24xKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RSZXNwaXJhdGlvbjIpKStnZ3RpdGxlKHBhc3RlMCgiRTNJU0wiKSkrDQogeGxhYigiRGF0ZSIpK3lsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikrdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgICAgDQoNCiMjI3ByZWRpY3RlZCB2cyBvYnNlcnZlZCBpbiBTTA0KDQpgYGB7cn0NCkJpb21hc3MuU0wlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFM0lTTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCmBgYA0KDQoNCiMjIyNTUyByb290IGFuYWx5c2lzDQpgYGB7cn0NCkJpb21hc3MuU1M8LUJpb21hc3MlPiUNCiAgZmlsdGVyKElEPT0iRTNJU1MiKSU+JQ0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIikNCkJpb21hc3MuU1MlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RSZXNwaXJhdGlvbjEpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3BvaW50KGFlcyh5PVJvb3RXdCxzaXplPTIpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFJlc3BpcmF0aW9uMikpK2dndGl0bGUocGFzdGUwKCJFM0lTUyIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiUm9vdCBiaW9tYXNzIChrZy9oYSkiKSt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQpgYGAgICANCg0KIyMjcHJlZGljdGVkIHZzIG9ic3NlcnZlZA0KDQpgYGB7cn0NCkJpb21hc3MuU1MlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFM0lTUy5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCmBgYA0KDQoNCg0KDQojIyNFNUxMRjUNCmBgYHtyfQ0KQmlvbWFzcy5MTEY1PC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkU1SUxMRjUiKSU+JQ0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIikNCkJpb21hc3MuTExGNSU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFJlc3BpcmF0aW9uMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0LHNpemU9Mixjb2xvcj0iYmx1ZSIpKQ0KYGBgICAgDQoNCiMjI3ByZWRpY3RlZCB2cyBvYnNzZXJ2ZWQNCg0KYGBge3J9DQpCaW9tYXNzLkxMRjUlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KYGBgDQoNCg0KIyMjI0U1SEhGNQ0KYGBge3J9DQpCaW9tYXNzLkhIRjU8LUJpb21hc3MlPiUNCiAgZmlsdGVyKElEPT0iRTVJSEhGNSIpJT4lDQogIGZpbHRlcihSb290UmVzcGlyYXRpb24xIT0iTkEiKQ0KQmlvbWFzcy5ISEY1JT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSwgeT1Sb290UmVzcGlyYXRpb24xKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2d0aXRsZShwYXN0ZTAoIkU1SUhIRjUiKSkrDQogeGxhYigiRGF0ZSIpK3lsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikrdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgICAgDQoNCiMjI3ByZWRpY3RlZCBWcyBvYnNlcnZlZA0KYGBge3J9DQpCaW9tYXNzLkhIRjUlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFNUlISEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KDQpgYGANCg0KDQojIyNFNVNTRjUNCmBgYHtyfQ0KQmlvbWFzcy5TU0Y1PC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKSU+JQ0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIikNCkJpb21hc3MuU1NGNSU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFJlc3BpcmF0aW9uMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0LHNpemU9Mixjb2xvcj0iYmx1ZSIpKQ0KYGBgICANCiMjI3ByZWRpY3RlZCBWcyBvYnNlcnZlZA0KYGBge3J9DQpCaW9tYXNzLlNTRjUlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFNUlTU0Y1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KDQpgYGANCg==